這篇文章主要分享了Java異常簡介和架構,具有一定的參考價值,有興趣的小夥伴們可以參考一下
Java異常簡介
Java異常是Java所提供的一種辨識及回應錯誤的一致性機制。
Java異常機制可以使程式中異常處理程式碼和正常業務程式碼分離,保證程式碼更加優雅,並提高程式健壯性。在有效使用異常的情況下,異常能清晰的回答what, where, why這3個問題:異常類型回答了「什麼」被拋出,異常堆疊追蹤回答了「在哪「拋出,異常訊息回答了「為什麼「會拋出。
Java異常機制用到的幾個關鍵字:try、catch、finally、throw、throws。
• try -- 用於監聽。將要被監聽的程式碼(可能拋出例外的程式碼)放在try語句區塊之內,當try語句區塊內發生例外狀況時,例外狀況就被拋出。
• catch -- 用於捕捉異常。 catch用來捕捉try語句區塊中發生的異常。
• finally -- finally語句區塊總是會被執行。它主要用於回收在try區塊裡開啟的物力資源(如資料庫連線、網路連線和磁碟檔案)。只有在finally區塊,執行完成之後,才會回來執行try或catch區塊中的return或throw語句,如果finally中使用了return或throw等終止方法的語句,則不會跳回執行,直接停止。
• throw -- 用來拋出例外。
• throws -- 用在方法簽章中,用來宣告該方法可能拋出的例外。
以下透過幾個範例對這幾個關鍵字進行簡單了解。
範例一: 了解try和catch基本用法
public class Demo1 { public static void main(String[] args) { try { int i = 10/0; System.out.println("i="+i); } catch (ArithmeticException e) { System.out.println("Caught Exception"); System.out.println("e.getMessage(): " + e.getMessage()); System.out.println("e.toString(): " + e.toString()); System.out.println("e.printStackTrace():"); e.printStackTrace(); } } }
執行結果:
Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java .lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:6)
結果說明:在try語句區塊中有除數為0的操作,該操作會拋出java.lang.ArithmeticException異常。透過catch,對該異常進行捕獲。
觀察結果我們發現,並沒有執行System.out.println("i="+i)。這說明try語句區塊發生異常之後,try語句區塊中的剩餘內容就不會再被執行了。
範例二: 了解finally的基本用法
在"範例一"的基礎上,我們加入finally語句。
public class Demo2 { public static void main(String[] args) { try { int i = 10/0; System.out.println("i="+i); } catch (ArithmeticException e) { System.out.println("Caught Exception"); System.out.println("e.getMessage(): " + e.getMessage()); System.out.println("e.toString(): " + e.toString()); System.out.println("e.printStackTrace():"); e.printStackTrace(); } finally { System.out.println("run finally"); } } }
執行結果:
Caught Exception
e.getMessage(): / by zero
e.toString() : java。
結果說明:最終執行了finally語句區塊。
範例三:
了解throws和throw的基本用法
class MyException extends Exception { public MyException() {} public MyException(String msg) { super(msg); } } public class Demo3 { public static void main(String[] args) { try { test(); } catch (MyException e) { System.out.println("Catch My Exception"); e.printStackTrace(); } } public static void test() throws MyException{ try { int i = 10/0; System.out.println("i="+i); } catch (ArithmeticException e) { throw new MyException("This is MyException"); } } }執行結果:
Catch My Exception
MyException: This is MyException
at Demo3.main(Demo3.java:13)
結果說明:
Java異常框架
Java異常架構圖
1. Throwable
Throwable是Java 語言中所有錯誤或例外的超類別。 Throwable包含兩個子類別: Error 和 Exception。它們通常用於指示發生了異常情況。 Throwable包含了其執行緒建立時執行緒執行堆疊的快照,它提供了printStackTrace()等介面用於取得堆疊追蹤資料等資訊。
2. Exception
# Exception及其子類別是Throwable 的一種形式,它指出了合理的應用程式想要捕獲的條件。
3. RuntimeException
# RuntimeException是那些可能在 Java 虛擬機器正常運作期間拋出的例外的超類別。 4. Error # 和Exception一樣,Error也是Throwable的子類別。它用於指示合理的應用程式不應該試圖捕獲的嚴重問題,大多數這樣的錯誤都是異常條件。 Java將可拋出(Throwable)的結構分為三種:被檢查的例外(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)。 (01) 執行時期例外 定義: RuntimeException及其子類別都稱為執行時期例外。 (02) 被檢查的異常 定義: Exception類別本身,以及Exception的子類別中除了"運行時異常"之外的其它子類別都屬於被檢查異常。 (03) 錯誤 #定義: Error類別及其子類別。
編譯器不會檢查RuntimeException異常。例如,除數為零時,拋出ArithmeticException異常。 RuntimeException是ArithmeticException的超類別。當程式碼發生除數為零的情況時,倘若既"沒有透過throws聲明拋出ArithmeticException異常",也"沒有通過try...catch...處理該異常",也能通過編譯。這就是我們所說的"編譯器不會檢查RuntimeException異常"!
如果程式碼會產生RuntimeException異常,則需要透過修改程式碼來避免。例如,若會發生除數為零的情況,則需要透過程式碼避免該情況的發生!
和RuntimeException一樣,編譯器也不會檢查Error。
特點: Java編譯器不會檢查它。也就是說,當程式中可能出現這類異常時,倘若既"沒有透過throws聲明拋出它",也"沒有用try-catch語句捕獲它",還是會編譯通過。例如,除數為零時產生的ArithmeticException異常,數組越界時產生的IndexOutOfBoundsException異常,fail-fail機制產生的ConcurrentModificationException異常等,都屬於運行時異常。
雖然Java編譯器不會檢查執行時期異常,但是我們也可以透過throws進行宣告拋出,也可以透過try-catch對它進行捕獲處理。
如果產生運行時異常,則需要透過修改程式碼來進行避免。例如,若會發生除數為零的情況,則需要透過程式碼避免該情況的發生!
特點: Java編譯器會檢查它。此類異常,要么透過throws進行聲明拋出,要么通過try-catch進行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當透過clone()接口去克隆一個對象,而該對象對應的類別沒有實作Cloneable接口,就會拋出CloneNotSupportedException異常。
被檢查異常通常都是可以恢復的。
特點: 和執行時異常一樣,編譯器也不會對錯誤進行檢查。
當資源不足、約束失敗、或是其它程式無法繼續運作的條件發生時,就產生錯誤。程式本身無法修復這些錯誤的。例如,VirtualMachineError就屬於錯誤。
依照Java慣例,我們是不應該是實作任何新的Error子類別的!
對於上面的3種結構,我們在拋出異常或錯誤時,到底該哪一種? 《Effective Java》中給出的建議是:對於可以恢復的條件使用被檢查異常,對於程式錯誤使用運行時異常。
以上是Java異常簡介和架構的具體程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

要解決Java應用程序中的平台特定問題,可以採取以下步驟:1.使用Java的System類查看系統屬性以了解運行環境。 2.利用File類或java.nio.file包處理文件路徑。 3.根據操作系統條件加載本地庫。 4.使用VisualVM或JProfiler優化跨平台性能。 5.通過Docker容器化確保測試環境與生產環境一致。 6.利用GitHubActions在多個平台上進行自動化測試。這些方法有助於有效地解決Java應用程序中的平台特定問題。

類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),