Java?try?catch語句異常處理詳解
Java try catch語句
在實際應(yīng)用中,對于錯誤的處理是極其重要的,任何程序都很難做到百分百完美,程序中可能存在大量未知問題,所以程序開發(fā)時一定要對各種問題進行相應(yīng)的處理,而 Java 提供的異常處理機制可以幫用戶更好地解決這方面的問題。Java 的異常處理機制可以讓程序具有極好的容錯性,讓程序更加健壯。
Java 的異常處理通過 5 個關(guān)鍵字來實現(xiàn):try、catch、throw、throws 和 finally。
try catch 語句用于捕獲并處理異常,finally 語句用于在任何情況下(除特殊情況外)都必須執(zhí)行的代碼,throw 語句用于拋出異常,throws 語句用于聲明可能會出現(xiàn)的異常。
這里主要介紹 Java 中的 try catch 語句。在 Java 中通常采用 try catch 語句來捕獲異常并處理。語法格式如下:
try { // 可能發(fā)生異常的語句 } catch(ExceptionType e) { // 處理異常語句 }
在以上語法中,把可能引發(fā)異常的語句封裝在 try 語句塊中,用以捕獲可能發(fā)生的異常。catch 后的( )
里放匹配的異常類,指明 catch 語句可以處理的異常類型,發(fā)生異常時產(chǎn)生異常類的實例化對象。
如果 try 語句塊中發(fā)生異常,那么一個相應(yīng)的異常對象就會被拋出,然后 catch 語句就會依據(jù)所拋出異常對象的類型進行捕獲,并處理。處理之后,程序會跳過 try 語句塊中剩余的語句,轉(zhuǎn)到 catch 語句塊后面的第一條語句開始執(zhí)行。
如果 try 語句塊中沒有異常發(fā)生,那么 try 塊正常結(jié)束,后面的 catch 語句塊被跳過,程序?qū)?catch 語句塊后的第一條語句開始執(zhí)行。
注意:try...catch 與 if...else 不一樣,try 后面的花括號{ }
不可以省略,即使 try 塊里只有一行代碼,也不可省略這個花括號。與之類似的是,catch 塊后的花括號{ }
也不可以省略。另外,try 塊里聲明的變量只是代碼塊內(nèi)的局部變量,它只在 try 塊內(nèi)有效,其它地方不能訪問該變量。
在上面語法的處理代碼塊 1 中,可以使用以下 3 個方法輸出相應(yīng)的異常信息。
- printStackTrace() 方法:指出異常的類型、性質(zhì)、棧層次及出現(xiàn)在程序中的位置。
- getMessage() 方法:輸出錯誤的性質(zhì)。
- toString() 方法:給出異常的類型與性質(zhì)。
例 1
編寫一個錄入學(xué)生姓名、年齡和性別的程序,要求能捕捉年齡不為數(shù)字時的異常。在這里使用 try catch 語句來實現(xiàn),具體代碼如下:
import java.util.Scanner; public class Test02 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("---------學(xué)生信息錄入---------------"); String name = ""; // 獲取學(xué)生姓名 int age = 0; // 獲取學(xué)生年齡 String sex = ""; // 獲取學(xué)生性別 try { System.out.println("請輸入學(xué)生姓名:"); name = scanner.next(); System.out.println("請輸入學(xué)生年齡:"); age = scanner.nextInt(); System.out.println("請輸入學(xué)生性別:"); sex = scanner.next(); } catch (Exception e) { e.printStackTrace(); System.out.println("輸入有誤!"); } System.out.println("姓名:" + name); System.out.println("年齡:" + age); } }
上述代碼在 main() 方法中使用 try catch 語句來捕獲異常,將可能發(fā)生異常的age = scanner.nextlnt();
代碼放在了 try 塊中,在 catch 語句中指定捕獲的異常類型為 Exception,并調(diào)用異常對象的 printStackTrace() 方法輸出異常信息。運行結(jié)果如下所示:
---------學(xué)生信息錄入---------------
請輸入學(xué)生姓名:
徐白
請輸入學(xué)生年齡:
110a
java.util.InputMismatchException
at 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)
輸入有誤!
姓名:徐白
年齡:0
at text.text.main(text.java:19)
多重catch語句
如果 try 代碼塊中有很多語句會發(fā)生異常,而且發(fā)生的異常種類又很多。那么可以在 try 后面跟有多個 catch 代碼塊。多 catch 代碼塊語法如下:
try { // 可能會發(fā)生異常的語句 } catch(ExceptionType e) { // 處理異常語句 } catch(ExceptionType e) { // 處理異常語句 } catch(ExceptionType e) { // 處理異常語句 ... }
在多個 catch 代碼塊的情況下,當(dāng)一個 catch 代碼塊捕獲到一個異常時,其它的 catch 代碼塊就不再進行匹配。
注意:當(dāng)捕獲的多個異常類之間存在父子關(guān)系時,捕獲異常時一般先捕獲子類,再捕獲父類。所以子類異常必須在父類異常的前面,否則子類捕獲不到。
例 2
public class Test03 { 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); // 讀取文件中的一行數(shù)據(jù) 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(輸入輸出)流技術(shù)從文件 readme.txt 中讀取字符串,然后解析成為日期。由于 Java I/O 技術(shù)還沒有介紹,大家先不要關(guān)注 I/O 技術(shù)細節(jié),只看調(diào)用它們時方法會發(fā)生的異常就可以了。
在 try 代碼塊中第 12 行代碼調(diào)用 FileInputStream 構(gòu)造方法可能會發(fā)生 FileNotFoundException 異常。第 16 行代碼調(diào)用 BufferedReader 輸入流的 readLine() 方法可能會發(fā)生 IOException 異常。FileNotFoundException 異常是 IOException 異常的子類,應(yīng)該先捕獲 FileNotFoundException 異常,見代碼第 23 行;后捕獲 IOException 異常,見代碼第 26 行。
如果將 FileNotFoundException 和 IOException 捕獲順序調(diào)換,那么捕獲 FileNotFoundException 異常代碼塊將永遠不會進入,F(xiàn)ileNotFoundException 異常處理永遠不會執(zhí)行。 上述代碼第 29 行 ParseException 異常與 IOException 和 FileNotFoundException 異常沒有父子關(guān)系,所以捕獲 ParseException 異常位置可以隨意放置。
那么在以下幾種場景中,會需要使用try..catch捕獲程序異常
- 程序涉及到打開關(guān)閉數(shù)據(jù)文件等資源時,使用完后要關(guān)閉的情況下,要使用 try-catch防止出現(xiàn)io異常;
- 在涉及到網(wǎng)絡(luò)連接編程時,由于網(wǎng)絡(luò)連接存在不確定性,所有需要對相關(guān)代碼塊進行 try…catch ,防止網(wǎng)絡(luò)異常帶來的程序出錯;
- 還有一些不可預(yù)料的可能發(fā)生錯誤的代碼塊需要try..catch;如:i/0 這類異常 ,空指針異常,數(shù)組越界異常等
總結(jié)
到此這篇關(guān)于Java try catch語句異常處理詳解的文章就介紹到這了,更多相關(guān)Java try catch語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+Vue實現(xiàn)數(shù)據(jù)添加功能
這篇文章主要介紹了SpringBoot+Vue實現(xiàn)數(shù)據(jù)添加功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03詳解Spring學(xué)習(xí)之聲明式事務(wù)管理
這篇文章主要介紹了詳解Spring學(xué)習(xí)之聲明式事務(wù)管理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07SpringCloud之Admin服務(wù)監(jiān)控實現(xiàn)流程示例詳解
這篇文章主要為大家介紹了SpringCloud之Admin服務(wù)監(jiān)控流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09