異常
在java中,有兩個類用於處理錯誤:Error和Exception.
Error處理的是java 運行環境中的內部錯誤或者硬件問題,比如內存資源不足、系統崩潰等。對於這種錯誤,程序一般無能爲力,除了退出運行外別無選擇。
而對於Exception,他處理的是因爲程序設計的瑕疵而引起的問題或者外在的輸入等引起的一般性問題。例如在除法中,除數爲零以及網絡不穩定引起的讀取網絡問題等,都可以通過Exception來處理。
對於異常的分類我們用一個圖來講述。請看下圖。
異常主要分爲兩類:Error和Exception類其都是Throwable類的子類。
Error主要有以上四個子類。見上圖。
Exception類主要分爲RuntimeException、IOException、其他異常。
這裏主要介紹一下RuntimeException和IOException。
RuntimeException異常的原因主要包括以下幾種:
(1)錯誤類型轉換。
(2)數組越界訪問。
(3)數學計算錯誤。
(4)試圖訪問一個空對象。
引起IOException異常的原因包括:
(1)指定文件未找到異常
(2)試圖從文件結尾處讀取信息。
(3)試圖打開一個不存在或者格式錯誤的URL。
下面一一進行舉例說明。
(1)錯誤類型轉換(ClassCastException )
package Practice; public class TestClassCastException { public static void main(String[] args) { //定義一個包裝類Integer的對象 Object x = new Integer(0); //當試圖將對象強制轉換爲不是實例的子類時,即下面轉換成String類型則拋出該異常。 System.out.println((String)x); } }
報異常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
at Practice.TestClassCastException.main(TestClassCastException.java:7)
(2)數組越界訪問(ArrayIndexOutOfBoundsException)
package Practice; public class TestArrayIndexOutOfBoundsException { public static void main(String[] args) { //定義一個長度是3的一位數組,並且從下標0到3給其賦值,在輸出賦值結果 int[] niArr = new int[3]; for(int i = 0;i<4;i++){ //數組長度爲3,下標從0到2但是我們給其賦值是從0到3 niArr[i] = i; System.out.println(niArr[i]); } } }
報異常:
0
1
2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Practice.TestClassCastException.main(TestClassCastException.java:6)
(3)數學計算異常(ArithmeticException )
package Practice; public class TestArithmeticException { public static void main(String[] args) { //我們設計一個輸出爲零的除法運算,輸出結果 int a = 4; int b = 0; int c = a/b; System.out.println("c:"+c); } }
報異常:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Practice.TestArrayIndexOutOfBoundsException.main(TestArrayIndexOutOfBoundsException.java:7)
(4)試圖訪問一個空對象(NullPointerException)
package Practice; import java.util.*; public class TesNullPointerException { public static void main(String[] args) { //定義一個Date類型數據 Date date = null; //調用該對象的getTime()方法並輸出結果 System.out.println(date.getTime()); } }
報異常:
Exception in thread "main" java.lang.NullPointerException
at Practice.TestArithmeticException.main(TestArithmeticException.java:6)
(5)指定文件未找到異常(FileNotFoundException )
package Practice; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; public class TestFileNotFoundException { public static void main(String[] args) throws IOException { //定義一個文件 File file = new File("f:/b.txt"); //創建一個文件輸入流對象 FileInputStream fis = new FileInputStream(file); //輸出出入流讀到的內容 System.out.println(fis.read()); } }
報異常:
Exception in thread "main" java.io.FileNotFoundException: f:\b.txt (系統找不到指定的文件。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at Practice.TestFileNotFoundException.main(TestFileNotFoundException.java:10)
其實異常還有很多我就不一一舉例了。
對於異常的劃分還可以大致分爲三類:
(1)運行時異常
(2)編譯時異常
(3)其他異常
(1)對於運行時異常,就是我們所說的RuntimeException,在程序運行時纔會報錯。
(2)對於編譯異常,在程序編寫時,編譯器就會報錯,在編譯時就得處理掉,否則程序都無法到運行階段。例如上面一個程序,就有一個編譯異常,我們在main的參數後面拋出了了一個IOException 異常。如果去掉,程序會報錯。有關異常的處理有待後文。