javaSE (二十八)異常的兩個分類、final、finally、finalize的區別、return在finally前後執行問題、異常練習題
阿新 • • 發佈:2018-12-16
1、異常的兩個分類:
編譯時異常: 在編譯某個程式時,有可能會發生的事情,比如檔案找不到,這樣的異常必須在編譯的時候處理,如果不處理編譯通不過
執行時異常: 就是程式設計師犯的錯誤,需要回來修改程式碼
2、final、finally、finalize的區別:
final:修飾類不能被繼承,修飾方法不能被重寫,修飾變數只能被賦值一次
finnally:是try語句中的一個語句體,不能單獨使用,用來釋放資源
finalize:當垃圾回收器確定不存在該物件的更多引用時,由物件的垃圾回收器呼叫該方法
3、return在finally前後執行問題:
問:下面的x輸出什麼值:
return就像是一個人的最後一口氣,在要掛掉之前,看一看finally裡面有沒有要執行的東西,但是這個地方,在catch裡面,已經把x裝箱了(return),建立了一個返回路徑
package cn.nupt;
public class ExtractionTest {
public static void main(String[] args) {
System.out.println(finTest());
}
public static int finTest() {
int x = 10;
try {
x = 20;
System.out.println(1 / 0);
return x;
} catch (Exception e) {
x = 30;
return x;
} finally {
x = 40;
}
}
}
4、異常練習題:
問題描述:輸入一個二進位制整數,輸入過大、過小、非法字元都要報錯
思路:
- 鍵盤輸入二進位制字串
- 字元轉換成整數
- 整數轉換成二進位制
- try-catch
注意:我們的異常都是在原有的異常上面疊加try-catch的,依次
檢驗異常
用一個while迴圈保證字串可以持續輸入
程式碼:
package cn.nupt;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;
public class ExtractionTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個整數:");
while(true) {
String line = sc.nextLine();
try {
int num = Integer.parseInt(line);
System.out.println(Integer.toBinaryString(num));
} catch (Exception e) {
try {
new BigInteger(line);
System.out.println("此數過大,請重新輸入:");
} catch (Exception e1) {
try {
new BigDecimal(line);
System.out.println("此數是分數,請重新輸入:");
} catch (Exception e2) {
System.out.println("此數是非法字元,請重新輸入:");
}
}
}
}
}
}