public class CH01201 {
public static void main(String[] args) {
int i = 50 / 0 ; //ArithmeticException
//String s = null ;
//System . out . println (s.length ()) ; //NullPointerException
//int a [] = new int [5] ;
//a [10] = 50 ; //ArrayIndexOutOfBoundsException
}
}
有些情況是無法進入例外處理的,比如作業系統的或是設備發生問題。
try • catch
所有異常和錯誤類型都是「Throwable」類的子類,都是在「執行階段」發生。一個分支以「Exception」為結尾,通常為程式執行中無預期發生如「NullPointerException」。另一個分支以「Error」為結尾,通常為「JVM」環境的限制如「 StackOverflowError」。這2種解釋都太過抽象,若用較為實際的方式則分為3種類型。1) Checked Exception
執行階段發生的異常狀況,能透過修改程式解決的異常:「IOException、SQLException...」。
import java.io.IOException;
public class CH01202 {
public static void main(String[] args) {
Process p = null;
while (true) {
try {
// p = Runtime.getRuntime().exec("wmic cpu get loadpercentage");
p = Runtime.getRuntime().exec("wmc cpu get loadpercentage"); // 可以透過修改程式碼解決異常
System.out.println("正確執行");
} catch (IOException e) {
System.out.println("捕捉到問題: "+e);
break;
}
}
}
}
2) Unchecked Exception
同樣是執行階段發生的異常狀況,不同之處在於沒有辦法透過修改程式解決:「ArithmeticException、NullPointerException、ArrayIndexOutOfBoundsException...」。
public class CH01203 {
public static void main(String[] args) {
int i[] = {1, 2, 3, 4};
//System.out.println(i[4]);
try{
System.out.println(i[4]);
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("成功捕捉: "+e);
}
}
}
3) Error
完全沒辦法避免的,例如「OutOfMemoryError、VirtualMachineError、AssertionError」。
public class CH01204 {
public static void main(String[] args) {
try {
System.out.printf("執行 %s 功能%n", args[0]);
}catch(Exception e) {
System.out.println("沒有指定參數!");
//e.printStackTrace();
}finally{
System.out.println("執行完成...");
}
}
}
catch(Exception e)可以捕捉到所有問題,但是只會提示第1個。使用上很方便,但是沒有辦法精確處理不同問題。
連續偵測例外
可以根據可能出現的各種例外建立處理機制
import java.io.IOException;
public class CH01205 {
public static void main(String[] args) {
Process p = null;
while (true) {
try {
// p = Runtime.getRuntime().exec("wmic cpu get loadpercentage");
p = Runtime.getRuntime().exec("wmc cpu get loadpercentage"); // 可以透過修改程式碼解決異常
System.out.println("正確執行");
} catch (IOException e) {
System.out.println("捕捉到問題: "+e);
break;
}catch(Exception e) {
System.out.println("捕捉到其他問題"+e);
break;
}
}
}
}
強制拋出例外
可以根據自己的喜好拋出不同的種類的例外public class CH01206 {
public static void main(String[] args) {
if (args != null) {
throw new NullPointerException("query is null");
}
}
}






沒有留言:
張貼留言