天天看點

Java Web簡明教程–Java篇[6]–處理異常

之前一篇已經描述了如何在工作中處理一些突如其來的錯誤——異常,但是大王應該還是不會滿意的,決策者的時間是很寶貴的,彙報的時候應該有針對性,要總結,不能亂七八糟的就把問題抛給大王,是以刑部連夜加班,修改制度流程如下:

import java.util.Scanner;//導入用于擷取控制台輸入的類Scanner
public class ExceptionDemo {//異常示範的例子
    public static void main(String[] args) {
  while(true){
    //使用無限循環模拟永遠線上等待指令的場景
    Scanner sc = new Scanner(System.in);
    System.out.println("大王,我們刑部這次要除掉哪個奸臣:");
    String command = sc.nextLine();//模拟擷取大王指令
    int army=100;//總兵力
    try{//可能有錯誤的語句放在try裡面
    int commandInt=Integer.parseInt(command);//了解大王旨意,軍機處比較傻,隻能了解數字
    int result=army/commandInt;
    System.out.println("大王,搞定,我們除掉【"+commandInt+"】了!");//模拟響應使用者指令
    }
    catch(ArithmeticException exArithmetic){
    System.out.println("大王,搞定,我們在搞掉【"+command+"】時遇到了算術問題,任務失敗");
    }
    catch(NumberFormatException exNumber){
    System.out.println("大王,搞定,我們在搞掉【"+command+"】時遇到了字元串轉換問題,任務失敗");
    }
    catch(Exception ex){//此處在下面測試中不會執行,為何?
    System.out.println("大王,我們遇到問題了:"+ex.getMessage());
    }finally{
    System.out.println("大王,之前"+command+"事情都過去了,您看還有需要什麼要訓示的嗎?");
    }
  }
    }
}      

此時,刑部響應大王指令的過程如下:

大王,我們刑部這次要除掉哪個奸臣:
0
大王,搞定,我們在搞掉【0】時遇到了算術問題,任務失敗
大王,之前0事情都過去了,您看還有需要什麼要訓示的嗎?
大王,我們刑部這次要除掉哪個奸臣:
張三
大王,搞定,我們在搞掉【張三】時遇到了字元串轉換問題,任務失敗
大王,之前張三事情都過去了,您看還有需要什麼要訓示的嗎?
大王,我們刑部這次要除掉哪個奸臣:      

這下,問題經過整理後抛出,便于決策者分析。那麼常見的有哪些問題呢(異常)。

剛剛上文提到的兩種是非常好了解的,ArithmeticException 是數學計算異常,NumberFormatException是 數字轉換格式異常。好的,平時常用的異常稍微總結下:

NullPointerException:空指向異常,如果一個對象沒new 直接使用,是以引用沒有指向堆的位址,是以引用沒有意義啊,那是要報錯的。

ArrayIndexOutOfBoundsException:數組下标越界,這個好了解。

EOFException:檔案已結束。

FileNotFoundException:檔案未找到。

SQLException:資料庫異常

NoSuchMethodException:方法未找到

ClassNotFoundException:找不到類異常

好的,不管Java中提供了多少種未定義的異常,總有它想不到的或者是我們想設定的,比如,如果大王自己規定,人名不能是負數,這種要算大王糊塗錯誤,那怎麼處理呢,不要緊,可以自定義異常。如下自定義一個異常類:

public class MinusException extends Exception{//自定義異常類,因為繼承了Exception類,是以成為了異常家族的一員
    public MinusException(String message)//構造函數,包含一條消息  
    {  
        super(message);  
    }  
}      

好的,這樣使用即可:

import java.util.Scanner;//導入用于擷取控制台輸入的類Scanner
public class ExceptionDemo {//異常示範的例子
    public static void main(String[] args) {
  while(true){
    //使用無限循環模拟永遠線上等待指令的場景
    Scanner sc = new Scanner(System.in);
    System.out.println("大王,我們刑部這次要除掉哪個奸臣:");
    String command = sc.nextLine();//模拟擷取大王指令
    int army=100;//總兵力
    try{//可能有錯誤的語句放在try裡面
    int commandInt=Integer.parseInt(command);//了解大王旨意,軍機處比較傻,隻能了解數字
    int result=army/commandInt;
    if(result<0)
        throw new MinusException("負數錯誤,負數為:"+commandInt);
    System.out.println("大王,搞定,我們除掉【"+commandInt+"】了!");//模拟響應使用者指令
    }
    catch(MinusException exMinus){
    System.out.println("大王,搞定,我們在搞掉【"+command+"】時遇到了"+exMinus.getMessage());
    }
    catch(ArithmeticException exArithmetic){
    System.out.println("大王,搞定,我們在搞掉【"+command+"】時遇到了算術問題,任務失敗");
    }
    catch(NumberFormatException exNumber){
    System.out.println("大王,搞定,我們在搞掉【"+command+"】時遇到了字元串轉換問題,任務失敗");
    }
    catch(Exception ex){
    System.out.println("大王,我們遇到問題了:"+ex.getMessage());
    ex.printStackTrace();
    }finally{
    System.out.println("大王,之前"+command+"事情都過去了,您看還有需要什麼要訓示的嗎?");
    }
  }
    }
}      

大王看到這個報告,終于露出了會心的笑容:小子們,你們的路還長着呢,嘿嘿嘿嘿

大王,我們刑部這次要除掉哪個奸臣:
-1
大王,搞定,我們在搞掉【-1】時遇到了負數錯誤,負數為:-1
大王,之前-1事情都過去了,您看還有需要什麼要訓示的嗎?
大王,我們刑部這次要除掉哪個奸臣: