異常(Exception)是程序在運行過程中由於硬件設備問題、軟件設計錯誤、缺陷等導致的程序錯誤。
(1)想打開的文件不存在。
(2)網絡連接中斷。
(3)操作數超出預定範圍。
(4)正在裝載的類文件丟失。
(5)訪問的數據庫打不開。
Java編程語言中,產生異常就是產生一個異常對象。
這個對象可能由應用程序本身產生,也可能由Java虛擬機產生,這取決於產生異常的類型。
該異常對象中包括了異常事件的類型以及發生異常的應用程序目前的狀態和調用過程。
import java.io.*;
public class Exception1 {
public static void main(String args[])
{
FileInputStream fis=new FileInputStream("text.txt");
int b;
while((b=fis.read())!=-1)
{
System.out.print(b);
}
fis.close();
}
}
上述程序在編譯成二進制代碼之前就出現3個錯誤,他們是由java.io.FileNotFoundException和java.io.IOException這兩個異常引發的。
public class Exception2 {
public static void main(String args[])
{
String langs []={"Java","Visaul Basic","C++"};
int i=0;
while(i<4)
{
System.out.println(langs[i]);
i++;
}
}
}
上述程序編譯可以通過,但運行時出現異常信息被拋出。java.lang.ArrayIndexOutOfBoundsException
public class Exception3 {
public static void main(String args[])
{
int a=0;
System.out.println(5/a);
}
}
編譯上述代碼得到其字節碼文件,然後運行出現除以0溢出的異常事件。java.lang.ArithmeticException:/byZero
可以看出,對於某些異常,在程序中必須對它進行處理,否則編譯程序會指出錯誤。但對於另一些異常,在程序中可以不做處理,而直接在運行時由系統來處理。
(1)捕獲異常:
在Java程序運行過程中系統得到一個異常對象時,它將會沿着方法的調用棧逐層回溯,尋找處理這一異常的代碼。
找到能夠處理這種類型異常的方法後,運行時系統把當前異常對象交給這個方法進行處理,這一過程稱爲捕獲(Catch)異常。
如果Java運行時系統找不到可以捕獲異常的方法,則運行時系統將終止,相應地,Java程序也將退出。
(2)聲明異常:
當Java程序運行中系統得到一個異常對象時,如果一個方法並不知道如何處理所出現的異常,則可在該方法聲明時,聲明拋棄(Throws)異常。
對於運行時異常,Java編譯器允許程序不對它們做出處理,
對於非運行時異常,則要求程序必須做捕獲或聲明拋棄處理,否則是無法通過程序編譯的。
捕獲異常是通過try-catch-finally語句實現的。
(1)try{}選定捕獲異常的範圍。
(2)catch塊中的代碼用來對異常對象進行處理。
(3)finally語句爲異常處理提供一個統一的出口。
具體來說:
(1)每個try代碼塊可以伴隨一個或多個catch語句。
(2)catch語句只有一個形式參數,用來指明它所能夠捕獲的異常類型。
(3)拋出的異常必須是Throwable或其子類的實例。
(4)catch塊中可以訪問一個異常對象的變量或調用它的方法。
getMessage()用來得到有關異常事件的信息。
printStackTrace()用來跟蹤異常事件發生時執行堆棧的內容。
(5)當捕獲到一個異常時,剩下的catch語句就不再進行匹配。
首先應該捕獲最特殊的異常,然後再逐漸一般化。即一般先安排子類,再安排父類。
(6)finally語句一般是用來關閉文件或釋放其他的系統資源。
(7)finally語句在程序中是可選的。
(8)存在finally語句時,無論try塊中是否發生了異常,是否執行過catch語句,都要執行finally語句。
(9)try-catch-finally語句可以嵌套。
import java.io.*;
public class Exception5 {
public static void main(String[] args)
{
try
{
FileInputStream fis=new FileInputStream("text.txt");
int b;
while((b=fis.read())!=-1)
{
System.out.print(b);
}
fis.close();
}
catch(FileNotFoundException e)
{
System.out.println(e);
System.out.println("Message:"+e.getMessage());
e.printStackTrace(System.out);
}
catch(IOException e)
{
System.out.println(e);
}
}
}
在一個方法中生成了一個異常且該方法不知道如何處理這一異常,該方法應該聲明拋棄異常。
聲明拋棄異常是在一個方法聲明的throws子句中指明。
throws子句中同時可以指明多個異常,之間由逗號隔開。
import java.io.*;
public class Exception4 {
public static void main(String[] args)throws FileNotFoundException,IOException
{
FileInputStream fis=new FileInputStream("text.txt");
int b;
while((b=fis.read())!=-1){
System.out.print(b);
}
fis.close();
}
}
如果text.txt文件存在,並內容正常,那麼程序可以正常運行。
如果text.txt文件不存在或有其他問題,那麼程序出現的異常將被提交給虛擬機處理。
try-catch-finally嵌套例子。
class MyoneException extends Exception
{}
public class TryInbed {
public static void main(String[] args)
{
System.out.println("Entering first try block");
try
{
System.out.println("Entering second try block");
try
{
throw new MyoneException();
}
finally
{
System.out.println("finally in 2nd try block");
}//try-catch-finally 嵌套在try限定範圍內
}
catch(MyoneException e)
{
System.err.println("Caught MyoneException in 1st try block");
}
finally
{
System.out.println("finally in 1st try block");
}
}
}
用戶自定義異常類,推薦以Exception爲直接父類。