標籤:分類 編譯 使用者 地方 處理異常 過程 runtime 檢查 出現
java中2種方法處理異常:
1、在發?異常的地方直接處理;
2、將異常拋給調用者,讓調?者處理。
異常分類
1、檢查性異常: java.lang.Exception
2、運?期異常: java.lang.RuntimeException
3、錯誤: java.lang.Error
頂層是java.lang.Throwable類,檢查性異常、運?期異常、錯誤都是這個類的?孫類,
ja va . la n g. Exce pt i on和ja va . la n g. Error繼承?ja va . la n g. Th rowa ble,?
java.lang.RuntimeException繼承?java.lang.Exception
1、檢查性異常:
程式正確,但因為外在的環境條件不滿?引發。例如:使用者錯誤及I/O問題--程式試圖打
開?個並不存在的遠程Socket端?,或者是開啟不存在的檔案時。這不是程式本身的邏輯
錯誤,?很可能是遠程機器名字錯誤(?戶拼字錯誤),對商?軟體系統,程式開發人員必須
考慮並處理這個問題。 java編譯器強制要求處理這類異常,如果不捕獲這類異常,程式將
不能被編譯。
2、運行期異常:
這意味著程式存在bug,如數組越界、 0被除、入參不滿足規範...這類異常需要更改程式
來避免, java編譯器強制要求處理這類異常。
3、錯誤:
一般很少見,也很難通過程式解決,它可能源於程式的bug,但?般更可能源於環境問
題,如記憶體耗盡。錯誤在程式中?需處理,由運行環境處理。
/*
栗子 異常 try...catch
*/
import java.util.Random;
public class test_fanxing {
public static void main(String[] args){
int x = new Random().nextInt(5);
int y = new Random().nextInt(10);
int[] z = new int[5];
try{
System.out.println("x=" + x + "y=" + y + "y/x=" + (y/x));
System.out.println("y=" + y + "z[y]=" + z[y]);
}
catch(ArithmeticException exc1){
//分步捕獲算術運算異常資訊
System.out.println("算術運算異常:" + exc1.getMessage());
}
catch(ArrayIndexOutOfBoundsException exc2){
System.out.println("數組越界異常:" + exc2.getMessage());
}
}
}
2、 finally
如果把finally塊置try...catch...語句後, finally塊?般都會得到執?,它相當於?個
萬能的保險,即使前?的try塊發?異常,??沒有對應異常的catch塊, finally塊將?上
執?。
以下情形, finally塊將不會被執?:
1、 finally塊中發?了異常;
2、程式所在的線程死亡;
3、在前?的代碼中?了System.exit();
4、關閉CPU
/*
栗子 finally
*/
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.Socket;
public class test_fanxing {
public static void main(String[] args) {
FileReader fr = null;
//檢查異常
//1. 開啟不存在的檔案
try{
//fr = new FileReader("D:\\aa.txt");
//System.exit(-1);//使用System.exit()後finally語句塊不再執行
Socket s = new Socket("192.168.956.1",21);
}
/* catch (FileNotFoundException e){
System.out.println("檔案不存在:" + e.getMessage());//getMessage()不如printStackTrace()
//e.printStackTrace();//輸出bug 資訊
}*/
catch(IOException e2){
e2.printStackTrace();
}
finally {
//try.catch...語句塊中不管出沒出現異常,一般都會執行finally語句塊
//一般說,把需要關閉的資源。如【檔案】、【連結】、【記憶體】....
System.out.println("測試進入finally語句塊");
if(fr!=null){
try{
fr.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
System.out.println("OK1");
}
}
/*
【結果】
檔案不存在:D:\aa.txt (系統找不到指定的檔案。)
測試進入finally語句塊
OK1
2.如果把第一個catch注釋掉
【結果】
java.net.UnknownHostException: 192.168.956.1
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at test_fanxing.main(test_fanxing.java:23)
測試進入finally語句塊
OK1
*/
【Java】【異常】