[Java]try catch finally 例外資訊處理

try catch是專門在處理錯誤事件的,很多程式語言都有這樣子的例外處理方法,Java也不例外,對於新入門的可能會比較少遇到這類型的問題,不過是十分重要的一環。

當程式功能越來越多、越來越大時,try catch的使用可以增加除錯(bug)的速度,try catch也可以使用其特性來製做一些技巧性的功能或判斷,而當使用者在操作期間發現了例外或錯誤,如果丟出一堆程式碼大概會讓使用者不知所為,擷取這些例外或錯誤而丟出使用者容易理解的字串,也是try catch的功能之一。

try catch 用法

try裡的敍述句有可能會丟出例外資訊 ( Exception ) ,而丟出的例外資訊 ( Exception ) 型態就可以由catch來取得,做適當的處理。finally則是在try catch完成後會執行的動作,一般都是使用在關閉或則除物件等。

ps.catch取得例外需由小範圍而後大範圍,例如java.lang.NullPointException則需寫在Exception前面,因為NullPointException所能處理的範圍比Exception還小。

3.png

try catch finally 範例

1.在進行資料庫存取時,需要取得資料庫連線,當連線有問題產生時,告知使用者資料庫連線有問題,而非丟出一堆例外訊息 ( Exception ) ,其中Connection需要寫在try catch外,在finally時才可取用

        java.sql.Connection con = null;
        try {
            // 以下任何資料庫操作均可能產生SQLException e
            con = db.Ooo.getConnection();//getConnection需自行實作
            java.sql.Statement stat = con.createStatement();
            java.sql.ResultSet rs = stat
                    .executeQuery("select 123 as t from dual");
            while (rs.next()) {
                System.out.println(rs.getInt("t"));
            }
        } catch (java.sql.SQLException e)// 處理資料庫操作錯誤
        {
            System.out.println("錯誤訊息:" + e.getMessage());
            System.out.println("資料庫處理錯誤!!!");
        } catch (Exception ex)// 除了SQLException以外之錯誤
        {
            System.out.println("錯誤訊息:" + ex.getMessage());
            System.out.println("除了資料庫處理錯誤以外的錯誤產生!!!");
        } finally {
            try {
                if (con != null)
                    con.close();
            } catch (java.sql.SQLException e) {
            }
        }

2.小技巧,利用try catch特性來判斷是否為數字型態

        String Num = "123";
        String notNum = "456a";
        try {
            Integer.parseInt(Num);
            System.out.println("是數字");
        } catch (java.lang.NumberFormatException e) {
            System.out.println("不是數字");
        }
        try {
            Integer.parseInt(notNum);
            System.out.println("是數字");
        } catch (java.lang.NumberFormatException e) {
            System.out.println("不是數字");
        }

3.function除了規定的回傳型態外,還能利用例外事件來產生第二種型能的回傳值

public class ExceptionFunction {

    public static boolean check(String id,String passwd)throws Exception
    {
        if(id==null || passwd ==null)
            throw new Exception("帳號密碼不可為空白");
        if(id.equals("123") && passwd.equals("456"))
            return true;
        else
            return false;
    }
    public static void main(String args[])
    {
        System.out.println("例子1");
        try
        {
            boolean islogin = check(null,"456");
            if(islogin)
                System.out.println("成功登入");
            else
                System.out.println("帳號或密碼錯誤");
        }catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        System.out.println("例子2");
        try
        {
            boolean islogin = check("1111","456");
            if(islogin)
                System.out.println("成功登入");
            else
                System.out.println("帳號或密碼錯誤");
        }catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        System.out.println("例子3");
        try
        {
            boolean islogin = check("123","456");
            if(islogin)
                System.out.println("成功登入");
            else
                System.out.println("帳號或密碼錯誤");
        }catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}
2.png

4.判斷是否與資料庫連線或則是找不到連線的類別

        try {

            Class.forName("com.mysql.jdbc.Driver");

            Connection MyConn = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/database?usr=root&password=1234");

            System.out.println("資料庫連線成功");

        } catch (ClassNotFoundException e) {
            System.out.println("找不到連線類別檔案");

        } catch (SQLException e) {
            System.out.println("資料庫無法連線");
            System.out.println("請檢查帳號及密碼是否有誤,");
            System.out.println("或者mysql服務是否關閉");
        }

4 thoughts to “[Java]try catch finally 例外資訊處理”

    1. @kun,
      你想像try catch間其實是被創造出來的一個空間
      當發生Exception錯誤時,只會在這個空間出錯,而錯誤會被catch取得
      當可以取得Exception的內容時,就可以針對它來做處理
      ex.
      try
      {
      資料庫1連線取得
      }catch(錯誤 x)
      {
      改去資料庫2取得連線
      }

kun 發表迴響 取消回覆