C語言中文網 目錄
首頁 > Java教程 > Java異常處理 閱讀:1,352

Java聲明和拋出異常:throws聲明異常、throw拋出異常、throw和throws的區別

Java 中的異常處理除了包括捕獲異常和處理異常之外,還包括聲明異常和拋出異常,可以通過 throws 關鍵字在方法上聲明該方法要拋出的異常,然后在方法內部通過 throw 拋出異常對象。本節詳細介紹在 Java 中如何聲明異常和拋出異常。

throws 關鍵字和 throw 關鍵字在使用上的幾點區別如下
  • throws 用來聲明一個方法可能拋出的所有異常信息,throw 則是指拋出的一個具體的異常類型。
  • 通常在一個方法(類)的聲明處通過 throws 聲明方法(類)可能拋出的異常信息,而在方法(類)內部通過 throw 聲明一個具體的異常信息。
  • throws 通常不用顯示地捕獲異常,可由系統自動將所有捕獲的異常信息拋給上級方法; throw 則需要用戶自己捕獲相關的異常,而后再對其進行相關包裝,最后將包裝后的異常信息拋出。

throws 聲明異常

當一個方法產生一個它不處理的異常時,那么就需要在該方法的頭部聲明這個異常,以便將該異常傳遞到方法的外部進行處理??梢允褂?throws 關鍵字在方法的頭部聲明一個異常,其具體格式如下:
returnType method_name(paramList) throws Exception 1,Exception2,…{…}

其中,returnType 表示返回值類型,method_name 表示方法名,Exception 1,Exception2,… 表示異常類。如果有多個異常類,它們之間用逗號分隔。這些異常類可以是方法中調用了可能拋出異常的方法而產生的異常,也可以是方法體中生成并拋出的異常。

例 1

創建一個 readFile() 方法,該方法用于讀取文件內容,在讀取的過程中可能會產生 IOException 異常,但是在該方法中不做任何的處理,而將可能發生的異常交給調用者處理。在 main() 方法中使用 try catch 捕獲異常,并輸出異常信息。代碼如下:
import java.io.FileInputStream;
import java.io.IOException;
public class Test04
{
    public void readFile() throws IOException
    {
        //定義方法時聲明異常
        FileInputStream file=new FileInputStream("read.txt");    //創達 FileInputStream 實例對象
        int f;
        while((f=file.read())!=-1)
        {
            System.out.println((char)f);
            f=file.read();
        }
        file.close();
    }
    public static void main(String[] args)
    {
        Throws t=new Test04();
        try
        {
            t.readFile();    //調用 readFHe()方法
        }
        catch(IOException e)
        {    //捕獲異常
            System.out.println(e);
        }
    }
}

以上代碼,首先在定義 readFile() 方法時用 throws 關鍵字聲明在該方法中可能產生的異常,然后在 main() 方法中調用 readFile() 方法,并使用 catch 語句捕獲產生的異常。

注意:在編寫類繼承代碼時要注意,子類在覆蓋父類帶 throws 子句的方法時,子類的方法聲明中的 throws 子句不能出現父類對應方法的 throws 子句中沒有的異常類型,因此 throws 子句可以限制子類的行為。也就是說,子類方法拋出的異常不會超過父類定義的范圍。

throw 拋出異常

throw 語句用來直接拋出一個異常,后接一個可拋出的異常類對象,其語法格式如下:
throw ExceptionObject;

其中,ExceptionObject 必須是 Throwable 類或其子類的對象。如果是自定義異常類,也必須是 Throwable 的直接或間接子類。例如,以下語句在編譯時將會產生語法錯誤:
throw new String("拋出異常");    //因為String類不是Throwable類的子類

當 throw 語句執行時,它后面的語句將不執行,此時程序轉向調用者程序,尋找與之相匹配的 catch 語句,執行相應的異常處理程序。如果沒有找到相匹配的 catch 語句,則再轉向上一層的調用程序。這樣逐層向上,直到最外層的異常處理程序終止程序并打印出調用棧情況。

例 2

在某倉庫管理系統中,要求管理員的用戶名需要由 8 位以上的字母或者數字組成,不能含有其他的字符。當長度在 8 位以下時拋出異常,并顯示異常信息;當字符含有非字母或者數字時,同樣拋出異常,顯示異常信息。代碼如下:
import java.util.Scanner;
public class Test05
{
    public boolean validateUserName(String username)
    {
        boolean con=false;
        if(username.length()>8)
        {    //判斷用戶名長度是否大于8位
            for(int i=0;i<username.length();i++)
            {
                char ch=username.charAt(i);    //獲取每一位字符
                if((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
                {
                    con=true;
                }
                else
                {
                    con=false;
                    throw new IllegalArgumentException("用戶名只能由字母和數字組成!"");
                }
            }
        }
        else
        {
            throw new IllegalArgumentException("用戶名長度必須大于 8 位!");
        }
        return con;
    }
    public static void main(String[] args)
    {
        Test05 te=new Test05();
        Scanner input=new Scanner(System.in);
        System.out.println("請輸入用戶名:");
        String username=input.next();
        try
        {
            boolean con=te.validateUserName(username);
            if(con)
            {
                System.out.println("用戶名輸入正確!");
            }
        }
        catch(IllegalArgumentException e)
        {
            System.out.println(e);
        }
    }
}

如上述代碼,在 validateUserName() 方法中兩處拋出了 IllegalArgumentException 異常,即當用戶名字符含有非字母或者數字以及長度不夠 8 位時。在 main() 方法中,調用了 validateUserName() 方法,并使用 catch 語句捕獲該方法可能拋出的異常。

運行程序,當用戶輸入的用戶名包含非字母或者數字的字符時,程序輸出異常信息,如下所示。
請輸入用戶名:
administrator@#
java.lang.IllegalArgumentException: 用戶名只能由字母和數字組成!

當用戶輸入的用戶名長度不夠 8 位時,程序同樣會輸出異常信息,如下所示。
請輸入用戶名:
admin
java.lang.IllegalArgumentException: 用戶名長度必須大于 8 位!

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户