在程序運行中,如果環境檢測出一個不可能執行的操作,就會出現運行時錯誤(runtime error)。例如:
越界錯誤ArrayIndexOutOfBoundsException。
文件不存在錯誤FileNotFoundException等等。
Java中,異常會導致運行時錯誤。異常就是一個表示阻止執行正常進行的錯誤或情況。如果異常沒有被處理,那麼程序將會非正常終止。
應該處理這個異常,以便使得程序可以繼續運行或平穩終止。
範例一:異常處理的創建、拋出、捕獲以及處理異常。
運行效果如圖所示:
實現的源代碼如下:
package Blog;
public class blogTryProject{
//獲取異常的信息
public static void main(String[]args){
try{
System.out.println(sum(new int[]{1,2,3,4,5}));
}
catch(Exception ex){
ex.printStackTrace();
System.out.println("\n"+ex.getMessage());
System.out.println("\n"+ex.toString());
System.out.println("\nTrace Info Obtained form getStackTrace");
StackTraceElement[] traceElements = ex.getStackTrace();
for(int i = 0;i < traceElements.length;i++){
System.out.print("method "+traceElements[i].getMethodName());
System.out.print("("+traceElements[i].getClassName()+":");
System.out.println(traceElements[i].getLineNumber()+")");
}
}
}
private static int sum(int[] list){
int result = 0;
for(int i = 0;i <= list.length;i++)
result += list[i];
return result;
}
}
主要有三個異常,ArithmeticException、FileNotFoundException和InputMismatchException在Java API中有很多預定義的異常類,如下圖所示:
範例二:鏈式異常和finally語句。
運行效果如圖所示:
實現的源代碼如下所示:
package Blog;
public class blogTryProject{
public static void main(String[]args){
//鏈式異常
ChainedExceptionDemo ced = new ChainedExceptionDemo();
ced.main(args);
//finally語句演示
FinallyDemo fd = new FinallyDemo();
fd.main(args);
}
}
//鏈式異常
class ChainedExceptionDemo{
public static void main(String[]args){
try{
method1();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void method1()throws Exception{
try{
method2();
}
catch(Exception ex){
throw new Exception("New info from method1,",ex);
}
}
public static void method2()throws Exception{
throw new Exception("New info from method2");
}
}
//finally語句演示
class FinallyDemo{
public static void main(String[]args){
java.io.PrintWriter output = null;
try{
output = new java.io.PrintWriter("text.txt");
output.println("Welcome to Java");
}
catch(java.io.IOException ex){
ex.printStackTrace();
}
finally{
if(output != null) output.close();
}
System.out.println("End of program");
}
}
範例三:自定製異常。
運行效果如圖所示:
實現的源代碼如下所示:
package Blog;
public class blogTryProject{
public static void main(String[]args){
System.out.println("\n自定製異常");
try{
Circle c = new Circle();
c.setRadius(-5);
}
catch(InvalidRadiusException ex){
System.out.println("The invalid radius is "+ex.getRadius());
}
}
}
//自定製異常
class InvalidRadiusException extends Exception{
private double radius;
public InvalidRadiusException(double radius) {
super("Invalid radius "+radius);
this.radius = radius;
}
public double getRadius(){
return radius;
}
}
//帶半徑異常的圓類自定義異常
class Circle{
private double radius;
private static int numberOfObjects = 0;
public Circle(){
this(1.0);
}
public Circle(double newRadius){
this.radius = newRadius;
// setRadius(newRadius);
numberOfObjects++;
}
public double getRadius(){
return radius;
}
public void setRadius(double newRadius)throws InvalidRadiusException{
if(newRadius >= 0)
radius = newRadius;
else
throw new InvalidRadiusException(newRadius);
}
public static int getNumberOfObjects(){
return numberOfObjects;
}
public double findArea(){
return radius * radius * Math.PI;
}
}