1.5 try catch语句详解
在實際應用中,對于錯誤的處理是極其重要的,任何程序都很難做到百分百完美,程序中可能存在大量未知問題,所以程序開發時一定要對各種問題進行相應的處理,而 Java 提供的異常處理機制可以幫用戶更好地解決這方面的問題。Java 的異常處理機制可以讓程序具有極好的容錯性,讓程序更加健壯。
Java 的異常處理通過 5 個關鍵字來實現:try、catch、throw、throws 和 finally。try catch 語句用于捕獲并處理異常,finally 語句用于在任何情況下(除特殊情況外)都必須執行的代碼,throw 語句用于拋出異常,throws 語句用于聲明可能會出現的異常。
本節先主要介紹 Java 中的 try catch 語句。在 Java 中通常采用 try catch 語句來捕獲異常并處理。語法格式如下:
try {// 可能發生異常的語句 } catch(ExceptionType e) {// 處理異常語句 }在以上語法中,把可能引發異常的語句封裝在 try 語句塊中,用以捕獲可能發生的異常。catch 后的( )里放匹配的異常類,指明 catch 語句可以處理的異常類型,發生異常時產生異常類的實例化對象。
如果 try 語句塊中發生異常,那么一個相應的異常對象就會被拋出,然后 catch 語句就會依據所拋出異常對象的類型進行捕獲,并處理。處理之后,程序會跳過 try 語句塊中剩余的語句,轉到 catch 語句塊后面的第一條語句開始執行。
如果 try 語句塊中沒有異常發生,那么 try 塊正常結束,后面的 catch 語句塊被跳過,程序將從 catch 語句塊后的第一條語句開始執行。
注意:try…catch 與 if…else 不一樣,try 后面的花括號{ }不可以省略,即使 try 塊里只有一行代碼,也不可省略這個花括號。與之類似的是,catch 塊后的花括號{ }也不可以省略。另外,try 塊里聲明的變量只是代碼塊內的局部變量,它只在 try 塊內有效,其它地方不能訪問該變量。
在上面語法的處理代碼塊 1 中,可以使用以下 3 個方法輸出相應的異常信息。
- printStackTrace() 方法:指出異常的類型、性質、棧層次及出現在程序中的位置
- getMessage() 方法:輸出錯誤的性質。
- toString() 方法:給出異常的類型與性質。
例 1
編寫一個錄入學生姓名、年齡和性別的程序,要求能捕捉年齡不為數字時的異常。在這里使用 try catch 語句來實現,具體代碼如下:
上述代碼在 main() 方法中使用 try catch 語句來捕獲異常,將可能發生異常的age = scanner.nextlnt();代碼放在了 try 塊中,在 catch 語句中指定捕獲的異常類型為 Exception,并調用異常對象的 printStackTrace() 方法輸出異常信息。運行結果如下所示。
---------學生信息錄入--------------- 請輸入學生姓名: 徐白 請輸入學生年齡: 110a java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Unknown Source)at java.util.Scanner.next(Unknown Source)at java.util.Scanner.nextInt(Unknown Source)at java.util.Scanner.nextInt(Unknown Source) 輸入有誤! 姓名:徐白 年齡:0at text.text.main(text.java:19)多重catch語句
如果 try 代碼塊中有很多語句會發生異常,而且發生的異常種類又很多。那么可以在 try 后面跟有多個 catch 代碼塊。多 catch 代碼塊語法如下:
try {// 可能會發生異常的語句 } catch(ExceptionType e) {// 處理異常語句 } catch(ExceptionType e) {// 處理異常語句 } catch(ExceptionType e) {// 處理異常語句 ... }在多個 catch 代碼塊的情況下,當一個 catch 代碼塊捕獲到一個異常時,其它的 catch 代碼塊就不再進行匹配。
注意:當捕獲的多個異常類之間存在父子關系時,捕獲異常時一般先捕獲子類,再捕獲父類。所以子類異常必須在父類異常的前面,否則子類捕獲不到。
例 2
public class Test {public static void main(String[] args) {Date date = readDate();System.out.println("讀取的日期 = " + date);}public static Date readDate() {FileInputStream readfile = null;InputStreamReader ir = null;BufferedReader in = null;try {readfile = new FileInputStream("readme.txt");ir = new InputStreamReader(readfile);in = new BufferedReader(ir);// 讀取文件中的一行數據String str = in.readLine();if (str == null) {return null;}DateFormat df = new SimpleDateFormat("yyyy-MM-dd");Date date = df.parse(str);return date;} catch (FileNotFoundException e) {System.out.println("處理FileNotFoundException...");e.printStackTrace();} catch (IOException e) {System.out.println("處理IOException...");e.printStackTrace();} catch (ParseException e) {System.out.println("處理ParseException...");e.printStackTrace();}return null;} }上述代碼通過 Java I/O(輸入輸出)流技術從文件 readme.txt 中讀取字符串,然后解析成為日期。
在 try 代碼塊中第 12 行代碼調用 FileInputStream 構造方法可能會發生 FileNotFoundException 異常。第 16 行代碼調用 BufferedReader 輸入流的 readLine() 方法可能會發生 IOException 異常。FileNotFoundException 異常是 IOException 異常的子類,應該先捕獲 FileNotFoundException 異常,見代碼第 23 行;后捕獲 IOException 異常,見代碼第 26 行。
如果將 FileNotFoundException 和 IOException 捕獲順序調換,那么捕獲 FileNotFoundException 異常代碼塊將永遠不會進入,FileNotFoundException 異常處理永遠不會執行。 上述代碼第 29 行 ParseException 異常與 IOException 和 FileNotFoundException 異常沒有父子關系,所以捕獲 ParseException 異常位置可以隨意放置。
總結
以上是生活随笔為你收集整理的1.5 try catch语句详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.4 异常处理机制及异常处理的基本结构
- 下一篇: 1.6 Java项目实战:计算平均成绩