第1關:學習-Java異常處理之try-catch之異常捕獲
- 任務描述
- 相關知識
- 什麼是異常
- 非運作時異常
- 運作時異常
- 錯誤
- 捕獲異常
- 異常的使用原則
- 程式設計要求
- 測試說明
任務描述
本關任務:求給定兩個數的商,并捕獲除數為 0 的異常。
相關知識
為了完成本關任務,你需要掌握: 1.什麼是異常; 2.如何捕獲異常; 3.異常的使用原則。
什麼是異常
異常:程式在運作過程中産生的不正常情況。
程式在運作的時候,發生了一些預期之外的事件,進而沒有按照我們編寫的代碼執行,這就是異常。
異常是 Java 中的錯誤,但是并不是所有的錯誤都是異常,比如說,你在定義變量名的時候沒有依照 Java 的規則,在語句的結尾少了一個分号,那麼運作出來結果是錯誤:
java.lang.Error
。
異常的原因有很多種,比如:
- 輸入了錯誤的資料,比如:程式需要的是 int 類型資料,而使用者輸入了一串字元串;
- 對象沒有初始化就調用,下面這段代碼就會提示空指針異常。
-
String str = null;
-
int length = str.length();
要了解 Java 中的異常是如何工作的,你需要掌握以下三種類型的異常:
- 非運作時異常;
- 運作時異常;
- 錯誤。
非運作時異常
非運作時異常也稱檢查型異常,如下圖 1 所示,當我們要打開一個檔案時,這段代碼就可能存在異常,因為這個檔案很有可能并不存在,是以在 IDE(程式設計軟體) 中就會有紅波浪線報錯。這種異常程式員是必須要處理的。

圖1
運作時異常
運作時才有可能會出現的異常,該類型異常程式員可以不去處理,當異常出現時,虛拟機會處理。常見的運作時異常有空指針異常。
錯誤
錯誤不是異常,而是脫離程式員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。
捕獲異常
如圖 1 所示,非運作時異常是需要我們提前處理的,那麼如何處理呢?
Java 中提供了一個捕獲異常的機制:try-catch,如下所示:
-
try{
-
代碼 A
-
代碼 B
-
}
-
catch(Exception e){
-
異常處理代碼
-
}
-
代碼 C
通過這兩個單詞的字面意思我們就能很好的了解了: try:嘗試;catch:捕獲。 嘗試執行代碼 A 和代碼 B,如果這兩段代碼有一個出現了異常,就會執行 catch 中的語句,如果代碼A、B 都不存在異常就不會執行 catch 代碼,最後繼續執行代碼 C。其中 catch 後面括号中寫的是異常的類型,Exception 可以代表所有異常,但是随着後面學習的深入,這裡的異常類型最好寫具體,比如 FileNotFoundException(檔案未找到異常)。
是以之前報錯的代碼我們這樣寫就沒錯啦:
-
public static void main(String[] args) {
-
try {
-
File file = new File("D://abc.c");
-
FileInputStream fileInputStream = new FileInputStream(file);
-
}
-
catch (Exception e){
-
System.out.println("檔案D://abc.c不存在");
-
}
-
System.out.println("代碼c部分");
-
}
在以上代碼中,我們使用 try-catch 語句捕獲了異常,是以程式就不會報錯了。
異常的使用原則
異常使用的原則主要有三個:
具體明确:指抛出的異常應能通過異常類名和 message 準确說明異常的類型和産生異常的原因; 提早抛出:指應盡可能早的發現并抛出異常,便于精确定位問題; 延遲捕獲:指異常的捕獲和處理應盡可能延遲,讓掌握更多資訊的作用域來處理異常。
程式設計要求
仔細閱讀右側編輯區内給出的代碼架構及注釋,在 Begin-End 間編寫程式代碼,求給定兩個數的商,并捕獲除數為 0 的異常,具體要求如下:
- 接收給定的資料(如:42 2。其中第一個數為被除數,第二個為除數);
- 求兩個數的商,并捕獲除數為 0 的異常,捕獲到該異常後輸出提示語句:“除數不能為0” 。
測試說明
平台将使用測試集運作你編寫的程式代碼,若全部的運作結果正确,則通關。可在右側 “測試結果”區檢視具體的測試集詳情。
測試輸入:
-
5 2
預期輸出:
-
2
測試輸入:
-
4 0
預期輸出:
-
除數不能為0
開始你的任務吧,祝你成功!
import java.util.Scanner;
public class ExcTest {
public static void main(String[] args) {
// 請在Begin-End間編寫代碼
/********** Begin **********/
// 第一步:接收給定的整數
Scanner x=new Scanner(System.in);
int a=x.nextInt();
int b=x.nextInt();
// 第二步:求給定兩個數的商,并捕獲除數為0的異常
try{
int q=a/b;
System.out.print(q);
/********** End **********/
}
catch(Exception e)
{
System.out.print("除數不能為0");
}
}}