很多小伙伴在剛開始學(xué)習(xí)java的時候往往會出現(xiàn)一大堆的錯誤。有些錯誤屬于語法錯誤,我們可以通過代碼檢查來找出這種錯誤,但有些錯誤是莫名其妙的。因為代碼是沒有問題的,但是運(yùn)行時偶爾會出現(xiàn)一些特殊情況導(dǎo)致代碼無法繼續(xù)運(yùn)行下去,這就是異常。java異常有哪幾種呢?接下來小編就帶你了解一下java的異常,以及如何處理異常。
什么是異常?
程序的異常指的是程序在運(yùn)行時,發(fā)生了一些不被期望的事件,而這些事件阻止了程序按照預(yù)期進(jìn)行正常執(zhí)行,這就是異常。
舉個例子:程序需要打開一個文件并做一些處理,但是這個文件并不存在。java代碼在運(yùn)行到打開這個文件這個步驟,因為沒有這個文件,也就沒有辦法打開這個文件,沒有辦法打開文件也就沒有辦法進(jìn)行文件的處理。這就是一個異常(一個文件打開異常)。
產(chǎn)生異常的原因
因為程序在運(yùn)行時總是可能會發(fā)生一些無法預(yù)料到的環(huán)境,所以產(chǎn)生的異常各有不同,比如說文件不存在,打開文件操作就會出現(xiàn)異常。也有可能是java虛擬機(jī)內(nèi)存溢出,也會導(dǎo)致異常(通常出現(xiàn)這種問題都是代碼沒有優(yōu)化才會出現(xiàn))。也有程序員在開發(fā)的時候不遵守規(guī)范導(dǎo)致的異常(比如除數(shù)不能為零,當(dāng)除數(shù)為零是會報除零異常,還有數(shù)組操作越界異常和空指針異常,這些都是初學(xué)者比較常見的異常)。
異常的分類
根據(jù)上面所舉的例子,大致可以將java的異常分成三類,分別是:
錯誤Error
這種異常是系統(tǒng)級別的異常,比如說Java虛擬機(jī)內(nèi)存溢出。這種異常在編譯時不會出現(xiàn),在運(yùn)行時也不會出現(xiàn),但在使用不當(dāng)?shù)那闆r下會出現(xiàn)。比如在java虛擬機(jī)最大可使用內(nèi)存為16m的情況下,不停地給StringBuffer追加字符,這樣子內(nèi)存很快就會被用光,這樣就會出現(xiàn)?OutOfMemoryError
?異常。
運(yùn)行時異常RuntimeException
這種異常通常出現(xiàn)在運(yùn)行時,所以被稱為運(yùn)行時異常。這種異常在編譯時不會出現(xiàn),一旦代碼運(yùn)行,就會出現(xiàn)異常。比如除零操作,這樣的代碼是可以編譯通過的,但在運(yùn)行的時候就會報錯。與除零異常同為運(yùn)行時異常的還有:空指針異常和下表越界等等。
可查異常 CheckedException
這種異常是必須處理的異常。這種異常通常在編譯時出現(xiàn)報錯,比如之前提到的文件不存在異常。這種異常必須進(jìn)行處理,否則編譯器不會通過編譯,而處理方式也就是接下來要介紹的?try-catch
?語句的使用。
?異常的處理?
在java中,有一組關(guān)鍵字被用來進(jìn)行異常的捕捉,它就是?try
?-?catch
?-?finally
?。代碼如下所示:
try{
// 嘗試執(zhí)行的可能會拋出異常的代碼
}catch(異常類型1 異常的變量名1){
// 當(dāng)異常拋出時,根據(jù)異常的類型和變量名執(zhí)行對應(yīng)的catch語句
//catch語句用來捕獲異常。
}catch(異常類型2 異常的變量名2){
// 程序代碼
}finally{
// 不管最終如何,一定要執(zhí)行的語句,一般做清理類型等收尾善后性質(zhì)的工作
//finally不是必要出現(xiàn)的
}
此外,還有一組關(guān)鍵字被用來拋出異常,它就是?throws
?/?throw
?關(guān)鍵字:
如果一個方法沒有捕獲一個可查異常,那么該方法必須使用 ?throws
?關(guān)鍵字來聲明。?throws
?關(guān)鍵字放在方法簽名的尾部。
也可以使用 ?throw
?關(guān)鍵字拋出一個異常,無論它是新實(shí)例化的還是剛捕獲到的。
下面方法的聲明拋出一個 ?RemoteException
?異常:
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
一個方法可以聲明拋出多個異常,多個異常之間用逗號隔開。
例如,下面的方法聲明拋出 ?RemoteException
?和 ?InsufficientFundsException
?:
import java.io.*;
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
什么異常需要捕捉
通常錯誤,運(yùn)行時異常和可查異常都可以被捕捉,但是一般情況下只有可查異常需要捕捉(因為不捕捉的話連編譯都過不了)。
小結(jié)
以上就是小編要介紹的java異常有哪幾種的詳細(xì)內(nèi)容。部分內(nèi)容參考了W3Cschool的java手冊。如果需要更深入的了解java異常,可以前往java手冊-異常處理進(jìn)行學(xué)習(xí)。