1. 程式人生 > >Java基礎——Java異常機制

Java基礎——Java異常機制

1.Java異常關鍵字

try{}           有可能出現異常的程式碼

catch{}      根據try{}語句塊中的異常和()中的異常來進行處理,可寫多個catch

finally{}     不管是否發生異常,都會執行的語句塊

throw        使用throw關鍵字從方法中跑出一個異常,拋給方法本身

throws      將方法的異常拋給呼叫者

 

示例:

表示拋強制異常異常的兩種方式

1、快捷鍵option/alt + 回車;2、在方法後面接上 —— throws InterruptedException

package com.java8.exception0823;

import java.io.File;
import java.io.IOException;

public class ExceptionTest {
    public static void main(String arg[]) throws InterruptedException {

        File file1 = new File("異常測試檔案");

        //方法1:try{} catch{}
        try {
            System.out.println("try 1");
            file1.createNewFile();//IOException
            Thread.sleep(100);//InterruptedException
            int a = 10/0;//丟擲除數為0的異常 ArithmeticException: / by zero
            System.out.println("try 2");
        }
        //catch可以有多個,針對try中不同的可能出現異常的函式,丟擲不同的異常,變現為e不相同
        catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("catch 1:InterruptedException");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("catch 2:IOException");
        } catch (Exception e){
            e.printStackTrace();
            System.out.println("catch 3:Exception");
        }
        //finally 無論如何都會執行
        finally {
            System.out.println("finally 1");
        }

        //方法2:在方法後面接上 —— throws InterruptedException
        System.out.println("try 3");
        Thread.sleep(1000);
        System.out.println("try 4");
    }
}

2.Java異常體系

Throwable類:

1 Error類       錯誤,程式碼無法解決的問題:棧溢位、...

2 Exception類   異常:對異常進行處理後,程式不會終止執行

 

3.異常的分類

 Exception

1 RuntimeException:執行時異常

 NullPointException:空指標

IndexOutOfBoundsException:陣列越界

ClassCastException:類轉換異常

ArithmeticException:除以0異常

2 強制異常

IO、執行緒,如寫一些函式時,出現紅色波浪號,強制拋異常

 

4.丟擲異常有三種形式

自動丟擲:

當程式語句出現一些邏輯錯誤、主義錯誤或型別轉換錯誤時,系統會自動丟擲異常

int a = 10/0;
//丟擲除數為0的異常 
//java.lang.ArithmeticException: / by zero

執行時,系統會丟擲異常:

java.lang.ArithmeticException: / by zero
    at com.java8.exception0823.ExceptionTest.main(ExceptionTest.java:21)

 

throw:

語句丟擲一個異常,一般是在程式碼塊的內部,當程式出現某種邏輯錯誤時由程式設計師主動丟擲某種特定型別的異常

        int testThrow = 0;
        if(testThrow==0){
            throw new NumberFormatException();
        }

執行時,系統會丟擲異常:

Exception in thread "main" java.lang.NullPointerException
    at com.java8.exception0823.ExceptionTest.main(ExceptionTest.java:13)

 

throws:

throws是方法可能丟擲異常的宣告。(用在宣告方法時,表示該方法可能要丟擲異常)

public void function() throws Exception{......}

當某個方法可能會丟擲某種異常時用於throws 宣告可能丟擲的異常,然後交給上層呼叫它的方法程式處理

package com.java8.exception0823;

public class TestThrows {

    //必須加上static
    public static void function() throws NumberFormatException{
        String name = "iris";
        Double.parseDouble(name);
    }
    public static void main(String[] arg){
        try{
            function();
        }catch(NumberFormatException e){
            System.err.println("非資料型別不能強制型別轉換。");
        }
    }

執行時,系統輸出:

非資料型別不能強制型別轉換。

5.程式出現異常解決辦法

    step1:確定異常型別
    step2:從異常堆疊資訊找到自己寫的類(多個)
    step3:找到最終的出異常的類
    step4:System.out.println()輸出資訊;
                Debug模式。

 

6.throw與throws的比較

1、throws出現在方法函式頭;而throw出現在函式體。
2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是丟擲了異常,執行throw則一定丟擲了某種異常物件。
3、兩者都是消極處理異常的方式(這裡的消極並不是說這種方式不好),只是丟擲或者可能丟擲異常,但是不會由函式去處理異常,真正的處理異常由函式的上層呼叫處理。

 

7.程式設計習慣

1.在寫程式時,對可能會出現異常的部分通常要用try{...}catch{...}去捕捉它並對它進行處理;
2.用try{...}catch{...}捕捉了異常之後一定要對在catch{...}中對其進行處理,那怕是最簡單的一句輸出語句,或棧輸入e.printStackTrace();
3.如果是捕捉IO輸入輸出流中的異常,一定要在try{...}catch{...}後加finally{...}把輸入輸出流關閉;
4.如果在函式體內用throw丟擲了某種異常,最好要在函式名中加throws拋異常宣告,然後交給呼叫它的上層函式進行處理。

ps.快捷鍵

IDEA拋異常快捷鍵:alt/option + command + T 、 alt + enter

自動格式化程式碼:ctrl + alt + L