App下載

java異常有哪幾種?如何處理?

猿友 2021-06-24 15:43:21 瀏覽數(shù) (4832)
反饋

很多小伙伴在剛開始學(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í)。


0 人點(diǎn)贊