第十二章:異常處理和文本I/O
一.異常處理概述
1.作用
異常處理使得程序可以處理非預期的情況,並且繼續正常的運行
2.在java中,運行時錯誤會當做異常處理,異常就是一個對象
3.異常是從方法拋出的,方法的調用者捕獲以及處理異常
try{
//正常情況下的運行情況
}
catch(type ex){//type:捕獲的異常類型 ex:catch塊的參數
//處理異常
}
二.異常類型
1.系統錯誤
2.異常是對象,而對象都採用類來定義,異常的根類是java.long.Throwable
也可以通過繼承Exception類或者Exception的子類來創建自己的異常類
3.常見異常
異常 | 說明 |
---|---|
ArrayIndexOutOfBountsException | 數組越界 |
InputMisMatchException | 輸入整數時輸成浮點數 |
ArthmeticException | 0作爲除數(浮點數除以0不會產生異常) |
IllegalArgamentException | 傳遞給方法的參數非法或不合適 |
注意
下面實例不會拋出異常,但是會溢出
long l=Long.MAX_VALUE+1;//-9223372036854775808
4.聲明和捕獲異常
聲明關鍵字:throws
聲明多個異常用逗號隔開
拋出關鍵字:throw
public static void method() throws Exception()
以下是聲明捕獲處理異常示例
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int x = in.nextInt();
int y = in.nextInt();
try {
System.out.println(devide(x, y));//正常情況下運行
} catch (ArithmeticException e) {//捕獲異常
System.out.println(e.toString());//處理異常
}
}
public static int devide(int x, int y) {//此處異常爲運行時異常,故不需要顯式聲明
if (y == 0) {
throw new ArithmeticException("0不能作除數");//拋出ArithmeticException異常
} else {
return x / y;
}
}
//輸入與返回結果:
//3
//0
//java.lang.ArithmeticException: 0不能作除數
三.異常處理
1.如果異常沒有在父類中聲明,那麼就不能在子類中對其進行繼承來聲明異常
2.如果異常沒有在當前的方法中捕獲,就會傳給方法的調用者,這個過程一直重複,直到異常被捕獲或傳到main方法
3.父類的catch塊出現在子類的catch快之前會出現編譯錯誤
try{}
catch(Exception e){}
catch(IOException e){}//錯誤的順序
4.JDK7中的多捕獲異常
catch(Exception1|Exception2|Exception3|……)
try{
method();//如果此方法拋出異常而沒有處理,則不會執行下面的語句
System.out.println("hello");
}
5.在沒有異常發生時,try-catch塊不會引起額外的系統開銷
6.finally子句
無論異常是否會發生,finally子句總是會被執行
即使到達finall子句前有return語句finally子句還是會被執行
7.如果一個異常處理器不能處理一個異常或只是讓調用者注意到這個異常,那就重新拋出這個異常
8.創建自定義異常類
Exception包括四個構造方法,以下是其中兩個
Exception();//沒有消息的異常
Exception(message:String);//有消息的異常
四.File類
File類包含了獲得文件/目錄的屬性,以及對文件改名和刪除的方法,不包含讀寫文件內容的方法。
構建File 實例不會在機器上創建一個文件,不管文件是否存在,都可以創建File實例
File file = new File("c:\\z下載\\files\\test\\Demo.txt");
File file = new File("c:/z下載/files/test/Demo.txt");
//使用/或者\\都可以
File類中的方法就不詳細介紹了,網上都可以查到。
五.文件的輸入和輸出
使用Scanner類從文本中讀取數據,用PrintWriter類從文本中寫數據
java.io.PrinterWriter 可以創建文件,並寫數據
必須使用close()關閉流,否則無法將數據保存至文件中
jdk7中可以使用try-with-source可以防止忘記關閉流
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("c:\\z下載\\files\\test\\notexist.txt");//創建File對象
try (PrintWriter printWriter = new PrintWriter(file)) {
for (int i = 0; i < 10; i++) {
printWriter.print(i);//將數據寫入文件
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
爲創建Scanne從文件中讀取數據,必須使用構造方法new File(fileName)創建一個實例。
File file = new File("c:\\z下載\\files\\test\\notexist.txt");
try (Scanner input = new Scanner(file)) {
while (input.hasNext()) {
System.out.print(input.nextInt());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
從Web上讀取數據
File file = new File("c:\\z下載\\files\\test\\notexist2.txt");
try {
URL url = new URL("http://www.baidu.com/index.html");
try (Scanner in = new Scanner(url.openStream()); // 打開流
PrintWriter printWriter = new PrintWriter(file)) {
while (in.hasNext()) {
printWriter.print(in.nextLine());//寫入文件
}
}
} catch (MalformedURLException e1) {// MalformedURLException 地址輸入錯誤異常
e1.printStackTrace();
}
注意
- 如果需要重複輸入,catch中寫in.nextLine()丟棄當前行並換行
- 類負責拋出異常,調用該方法的類負責捕獲和處理
自定義異常類步驟
- 繼承Exception或Exception 的子類
- 按需調用sper(s);
- 另一個類中聲明、拋出剛纔定義的異常類
- 測試類中捕獲、處理異常類
六.總結
通過本章的學習,我知道了Java異常及處理的基本知識,認識了好多異常和出現異常的原因,還學會了使用File類創建文本對象,懂得了文本的輸入和輸出,並從網絡上獲取信息。
加油!第十三章待更……