之前一篇已經描述了如何在工作中處理一些突如其來的錯誤——異常,但是大王應該還是不會滿意的,決策者的時間是很寶貴的,彙報的時候應該有針對性,要總結,不能亂七八糟的就把問題抛給大王,是以刑部連夜加班,修改制度流程如下:
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事情都過去了,您看還有需要什麼要訓示的嗎?
大王,我們刑部這次要除掉哪個奸臣: