實際工做中,遇到的狀況不多是很是完美的。好比:你寫的某個模塊,用戶輸入不必定符合你的要求、你的程序要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取數據庫的數據,數據多是空的等。咱們的程序再跑着,內存或硬盤可能滿了。等等。html
軟件程序在運行過程當中,很是可能遇到剛剛提到的這些異常問題,咱們叫異常,英文是:Exception,意思是例外。這些,例外狀況,或者叫異常,怎麼讓咱們寫的程序作出合理的處理。而不至於程序崩潰。java
設計良好的程序應該在異常發生時提供處理這些錯誤的方法,使得程序不會由於異常的發生而終斷或產生不可預見的結果。程序員
若是沒有異常處理機制,那麼:數據庫
1.邏輯代碼和錯誤處理代碼放一塊兒!編程
2.程序員自己須要考慮的例外狀況較複雜,對程序員自己要求較高!後端
異常機制就是當程序出現錯誤,程序如何安全退出的機制。數組
Java 如何處理異常?安全
第一個異常示例和解析:服務器
public static void main(String[]args){ int i=1/0; } 執行上述代碼的異常信息以下: Exception in thread"main"java.lang.ArithmeticException:/by zero at chuji.BubbleSort.main(BubbleSort.java:11)
Java 是採用面向對象的方式來處理異常的。微信
拋出異常:在執行一個方法時,若是發生異常,則這個方法生成表明該異常的一個對象,中止當前執行路徑,並把異常對象提交給 JRE。
捕獲異常:JRE 獲得該異常後,尋找相應的代碼來處理該異常。JRE 在方法的調用棧中查找,從生成異常的方法開始回溯,直到找到相應的異常處理代碼爲止。
JDK 中定義了不少異常類,這些類對應了各類各樣可能出現的異常事件,全部異常對象都是派生於 Throwable 類的一個實例。若是內置的異常類不可以知足須要,還能夠建立本身的異常類。
異常類之間的關係圖
Error 類層次描述了 Java 運行時系統內部錯誤和資源耗盡錯誤。這類錯誤是咱們沒法控制的,同時也是很是罕見的錯誤。因此在編程中,不去處理這類錯誤。
Error 代表系統 JVM 已經處於不可恢復的崩潰狀態中。咱們不須要管他。
打開 JDK 的:java.lang.error,查看他的全部子類。
全部異常類的父類,其子類對應了各類各樣可能出現的異常事件。
我開着車走在路上,一頭豬衝在路中間,我剎車。這叫一個異常。
我開着車在路上,發動機壞了,我停車,這叫錯誤。系統處於不可恢復的崩潰狀態。發動機何時壞?咱們普通司機能管嗎?不能。發動機何時壞是汽車廠發動機製造商的事。
出現 RuntimeException 就必定是你的問題,能夠不捕獲,由於當心點這些異常是能夠避免的。 派生於RuntimeException 的異常。是一類特殊的異常,如被 0 除、數組下標超範圍等,其產生比較頻繁,處理麻煩,若是顯式的聲明或捕獲將會對程序可讀性和運行效率影響很大。所以由系統自動檢測並將它們交給缺省的異常處理程序(用戶可沒必要對其處理)。這類異常一般是由編程錯誤致使的,由於只有當心點,這些異常都是能夠避免的,因此在編寫程序時,並不要求必須使用異常處理機制來處理這類異常,全部這類異常都繼承自java.lang.RuntimeException。
常見的運行時異常有:
ArithmeticException
如試圖除以0
NullPointerException
當程序訪問一個空對象的成員變量或方法,訪問一個空數組的成員時發生
ClassCastException
發生多態後,若是強制轉化的並非父類的子類時發生。編譯的時候能夠經過,由於編譯的時候並不會檢查類型轉化的問題
ArrayIndexOutOfBoundsException
訪問的元素下表超過數組長度
NumberFormatException
數字格式異常!
心得:
你們平時在遇到 NullPointerException,也就是空指針的問題時,不要只記得百度,應該從報錯的地方去分析本身的代碼,由於空指針實際上是你的代碼寫的不嚴謹形成的。空指針解決方案:Debug,看你對應的值是否爲 null。
全部不是 Runtime Exception 的異常,統稱爲 Checked Exception,又被稱爲「已檢查異常」。 這類異常的產生不是程序自己的問題,一般由外界因素形成的。爲了預防這些異常產生時,形成程序的中斷或獲得不正確的結果,Java 要求編寫可能產生這類異常的程序代碼時,必定要去作異常的處理。
編譯器將檢查是否爲全部已檢查異常提供異常處理。
這一類異常,咱們必須捕獲進行處理。
Java 語言將派生於 RuntimeException 類或 Error 類的全部異常稱爲「未檢查異常」。
try 語句指定了一段代碼,該段代碼就是一次捕獲並處理的範圍。在執行過程當中,當任意一條語句產生異常時,就會跳過該段中後面的代碼。代碼中可能會產生並拋出一種或幾種類型的異常對象,它後面的catch語句要分別對這些異常作相應的處理
一個 try 語句必須帶有至少一個 catch 語句塊或一個 finally 語句塊 。
注:當異常處理的代碼執行結束之後,是不會回到try語句去執行還沒有執行的代碼。
一、每一個 try 語句塊能夠伴隨一個或多個 catch 語句,用於處理可能產生的不一樣類型的異常對象。
2.、經常使用方法:
toString ( )方法,顯示異常的類名和產生異常的緣由
getMessage( ) 方法,只顯示產生異常的緣由,但不顯示類名。
printStackTrace( ) 方法,用來跟蹤異常事件發生時堆棧的內容。
這些方法均繼承自 Throwable 類
三、catch 捕獲異常時的捕獲順序:
若是異常類之間有繼承關係,在順序安排上需注意。越是頂層的類(父類),越放在下面。再否則就直接把多餘的catch 省略掉。
有些語句,不論是否發生了異常,都必需要執行,那麼就能夠把這樣的語句放到finally 語句塊中。
一般在 finally 中關閉程序塊已打開的資源,好比:文件流、釋放數據庫鏈接等。
public class TestException { public static void main(String[] args) { FileReader reader = null; try { reader = new FileReader("d:/a.txt"); char temp = (char) reader.read(); System.out.println("讀出的內容:" + temp); } catch (FileNotFoundException e) { System.out.println("文件沒有找到!!"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); System.out.println("文件讀取錯誤!"); } finally { System.out.println(" 無論有沒有異常,我確定會被執行!"); try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
1.執行 try,catch , 給返回值賦值
2.執行finally
3.return
當 Checked Exception 產生時,不必定馬上處理它,能夠再把異常 Throws 出去。
在方法中使用 try-chatch-finally 由這個方法處理異常。在一些狀況下,當前方法並不須要處理髮生的異常,而是向上傳遞給調用它的方法處理。
若是一個方法中可能產生某種異常,可是並不能肯定如何處理這種異常,則應根據異常規範在方法的首部聲明該方法可能拋出的異常。
若是一個方法拋出多個已檢查異常,就必須在方法的首部列出全部的異常,之間以逗號隔開。
public class FileTest { public static void main(String[] args) { try { readFile("d:/a.txt"); } catch (FileNotFoundException e) { System.out.println("所須要的文件不存在!"); e.printStackTrace(); } catch (IOException e) { System.out.println("文件讀寫出錯誤!"); e.printStackTrace(); } } public static void readFile(String fileName) throws IOException { FileReader in = new FileReader(fileName); try { int tem = 0; tem = in.read(); while (tem != -1) { System.out.println((char) tem); tem = in.read(); } } finally { in.close(); } } }
子類聲明的異常範圍不能超過父類聲明的範圍。包含以下意思:
Java 異常類對象除在程序執行過程當中出現異常時由系統自動生成並拋出,也可根據須要手工建立並拋出。
在捕獲一個異常前,必須有一段代碼先生成異常對象並把它拋出。這個過程咱們能夠手工作,也能夠由 JRE 來實現,可是他們調用的都是 throw 子句。
對於一個已經存在的異常類,拋出該類異常對象過程以下:
找到一個合適的異常類。
建立一個該類的對象。
將對象拋出
File f=new File("c:/tt.txt"); if(!f.exists()){ try{ throw new FileNotFoundException("File can't be found!"); }catch(FileNotFoundException e){ e.printStackTrace(); } }
在程序中,可能會遇到任何標準異常類都沒有充分的描述清楚的問題,這種狀況下能夠建立本身的異常類。
怎麼作:
從 Exception 類或者它的子類派生一個子類便可
習慣上,定義的類應該包含 2 個構造器:一個是默認的構造器,另外一個是帶有詳細信息的構造器。
典型代碼
class IllegalAgeException extends Exception { public IllegalAgeException() { } public IllegalAgeException(String msg) { super(msg); } } class Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { if (age < 0) throw new IllegalAgeException("人的年齡不該該爲負數"); this.age = age; } public String toString() { return "name is " + name + " and age is " + age; } } public class MyExceptionTest { public static void main(String[] args) { Person p = new Person(); try { p.setName("Lincoln"); p.setAge(-1); } catch (IllegalAgeException e) { e.printStackTrace(); System.exit(-1); } System.out.println(p); } }
如今的喜歡,其實不是真正的喜歡,只是由於不瞭解而已,真正的喜歡,是創建在很是瞭解的基礎上。瞭解 java 基礎,喜歡上編程,再也不迷茫。
喜歡文章的話能夠掃描關注微信公衆號
搜索微信公衆號:Java知其因此然,可免費領取某課、Java 後端面經等資源,還有統一環境(教你怎麼配置一套開發環境)視頻領取。