【Java基礎】--異常處理

ZeroWM發表於2015-09-08

異常概念

  程式執行期出現的異常事件。良好的程式應該在異常發生的時候提供處理這些異常的方法,使得程式不會因為異常的發生而阻斷或產生不可預見的結果。

異常處理原理

  這裡寫圖片描述
  

異常分類

這裡寫圖片描述
Throwable是所有錯誤或異常的超類。
Exception指出了合理的應用程式想要捕獲的條件。
RuntimeException是可能在Java虛擬機器正常執行期間丟擲的異常的超類。
Error用於指示合理的應用程式不應該試圖捕獲的嚴重問題。

使用異常的Demo:



        import java.io.*;

        public class TestEx{
            public static void main(String args[]){

            FileInputStream in =null;

            try{
                    in =new FileInputStream("myfile.txt");//必須對它進行捕捉或宣告丟擲
                int b;
                b=in.read();
                while(b!=-1){
                    // System.out.print((char )b);
                    System.out.print((char)b);
                    b=in.read();
                }
            }catch(FileNotFoundException e){//可以在try後面加多個Catch來捕獲異常,但是遵循先小後大
                e.printStackTrace();
            }catch(IOException e){
                System.out.println(e.getMessage());
            }finally{
                try{
                    in.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }

            }

            void m(int i ) throws ArithmeticException{
                if (i==0){
                    throw new ArithmeticException("被除數為0");
                }

            }


} 

捕獲異常前程式執行結果:
這裡寫圖片描述

異常捕獲處理

關鍵字

try: 包含可能產生例外的程式碼 ,後面跟一個或多個catch程式碼段。
catch:宣告處理的一種特定型別的異常並提供處理的方法。
finally:異常發生,程式會終止當前的流程,根據獲取異常去執行相應的catch程式碼,但是無論異常是否產生,程式始終會執行相應的finally程式碼段,一般釋放資源的程式碼經常寫在finally裡面。比如:開啟一個檔案,無論出錯不出錯,都要把檔案關閉,在finally面就寫把檔案關閉的程式碼。
throw:丟擲一個具體的異常型別。常在方法內通過throw宣告一個具體的異常資訊。需要使用者自己捕獲,然後對其進行相關包裝,最後在將包裝後的異常資訊丟擲。
throws:用來宣告一個方法可能丟擲的所有異常資訊。通過在一個方法的宣告處定義通過throws宣告方法可能丟擲的異常資訊。
例項:

public Test()throws RepletException{
    try{
      System.out.println("Test this Project!")
       }
       catch(Exception e){
       throw new Exception(e.toString());
       }
 }

總結

一個優秀的程式設計師,要有良好的程式設計習慣。異常處理是必不可缺的程式碼能力之一。異常處理讓接受和處理錯誤程式碼進行解耦和。理清了程式設計者的思緒,增強了程式碼的可讀性,方便了維護者的閱讀和理解。

2016年1月26日 補充DRP中學的一個異常的例項:

package com.bjpowernode.drp.basedata.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.bjpowernode.drp.basedata.domain.Item;
import com.bjpowernode.drp.util.ApplicationException;
import com.bjpowernode.drp.util.DbUtil;
import com.bjpowernode.drp.util.PageModel;

/**
 * @ClassName:ItemDao4OracleImpl
 * @Description:物料Oracle的具體實現
 * @author wm
 * @date 2016年1月25日下午4:12:30
 */
public class ItemDao4OracleImpl implements ItemDao {


    public void addItem(Connection conn, Item item) {

        String sql="insert into drp1.t_items (item_no,item_category_id,item_unit_id,item_name,spec,pattern, rowid)";
                sql+= "values(?,?,?,?,?,?,?)";
        PreparedStatement pstmt=null;
        try {
            pstmt=conn.prepareStatement(sql);
            pstmt.setString(1, item.getItemNO());
            pstmt.setString(2, item.getItemName());
            pstmt.setString(3, item.getSpec());
            pstmt.setString(4, item.getPattern());
            pstmt.setString(5, item.getItemCategory().getId());
            pstmt.setString(6, item.getItemUnit().getId());
            pstmt.executeUpdate();  
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ApplicationException("新增物料失敗!");

        }finally{
            DbUtil.close(pstmt);
        }
    }


}

執行時異常處理類:

/**
 * 
 */
package com.bjpowernode.drp.util;

/**
 * @ClassName:ApplicationException
 * @Description:執行期異常
 * @author wm
 * @date 2016年1月26日下午2:14:08
 */
public class ApplicationException extends RuntimeException {

    /**
     * 
     */
    public ApplicationException() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param message
     */
    public ApplicationException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param cause
     */
    public ApplicationException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param message
     * @param cause
     */
    public ApplicationException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param message
     * @param cause
     * @param enableSuppression
     * @param writableStackTrace
     */
    public ApplicationException(String message, Throwable cause,
            boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        // TODO Auto-generated constructor stub
    }

}

補充:2016年1月28日

異常的處理方式

1.根據每種業務語義建立不同的異常,如果UserNotFoundException
2.每層丟擲相應的異常,如DaoException ,ServiceException
3.每個模組丟擲一種異常,如SysMgrException
4.只丟擲一種異常,如AppException
5.錯誤碼可以做到異常粒度劃分,採用錯誤碼可以減少異常類的建立。

這裡寫圖片描述

相關文章