1. 程式人生 > >javaSE (二十八)異常的兩個分類、final、finally、finalize的區別、return在finally前後執行問題、異常練習題

javaSE (二十八)異常的兩個分類、final、finally、finalize的區別、return在finally前後執行問題、異常練習題

1、異常的兩個分類:

編譯時異常: 在編譯某個程式時,有可能會發生的事情,比如檔案找不到,這樣的異常必須在編譯的時候處理,如果不處理編譯通不過
執行時異常: 就是程式設計師犯的錯誤,需要回來修改程式碼

2、final、finally、finalize的區別:

final:修飾類不能被繼承,修飾方法不能被重寫,修飾變數只能被賦值一次
finnally:是try語句中的一個語句體,不能單獨使用,用來釋放資源
finalize:當垃圾回收器確定不存在該物件的更多引用時,由物件的垃圾回收器呼叫該方法

3、return在finally前後執行問題:

問:下面的x輸出什麼值:
return就像是一個人的最後一口氣,在要掛掉之前,看一看finally裡面有沒有要執行的東西,但是這個地方,在catch裡面,已經把x裝箱了(return),建立了一個返回路徑

,雖然還是會執行finally語句,但是不會改變x的賦值,所以,finally通常是關掉流,節約資源的作用,並不作賦值使用


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、異常練習題:

問題描述:輸入一個二進位制整數,輸入過大、過小、非法字元都要報錯
思路:

  1. 鍵盤輸入二進位制字串
  2. 字元轉換成整數
  3. 整數轉換成二進位制
  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("此數是非法字元,請重新輸入:"); } } } } } }