App下載

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

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

很多小伙伴在剛開始學(xué)習(xí)java的時(shí)候往往會(huì)出現(xiàn)一大堆的錯(cuò)誤。有些錯(cuò)誤屬于語法錯(cuò)誤,我們可以通過代碼檢查來找出這種錯(cuò)誤,但有些錯(cuò)誤是莫名其妙的。因?yàn)榇a是沒有問題的,但是運(yùn)行時(shí)偶爾會(huì)出現(xiàn)一些特殊情況導(dǎo)致代碼無法繼續(xù)運(yùn)行下去,這就是異常。java異常有哪幾種呢?接下來小編就帶你了解一下java的異常,以及如何處理異常。

什么是異常?

程序的異常指的是程序在運(yùn)行時(shí),發(fā)生了一些不被期望的事件,而這些事件阻止了程序按照預(yù)期進(jìn)行正常執(zhí)行,這就是異常。

舉個(gè)例子:程序需要打開一個(gè)文件并做一些處理,但是這個(gè)文件并不存在。java代碼在運(yùn)行到打開這個(gè)文件這個(gè)步驟,因?yàn)闆]有這個(gè)文件,也就沒有辦法打開這個(gè)文件,沒有辦法打開文件也就沒有辦法進(jìn)行文件的處理。這就是一個(gè)異常(一個(gè)文件打開異常)。

產(chǎn)生異常的原因

因?yàn)槌绦蛟谶\(yùn)行時(shí)總是可能會(huì)發(fā)生一些無法預(yù)料到的環(huán)境,所以產(chǎn)生的異常各有不同,比如說文件不存在,打開文件操作就會(huì)出現(xiàn)異常。也有可能是java虛擬機(jī)內(nèi)存溢出,也會(huì)導(dǎo)致異常(通常出現(xiàn)這種問題都是代碼沒有優(yōu)化才會(huì)出現(xiàn))。也有程序員在開發(fā)的時(shí)候不遵守規(guī)范導(dǎo)致的異常(比如除數(shù)不能為零,當(dāng)除數(shù)為零是會(huì)報(bào)除零異常,還有數(shù)組操作越界異常和空指針異常,這些都是初學(xué)者比較常見的異常)。

異常的分類

根據(jù)上面所舉的例子,大致可以將java的異常分成三類,分別是:

錯(cuò)誤Error

這種異常是系統(tǒng)級(jí)別的異常,比如說Java虛擬機(jī)內(nèi)存溢出。這種異常在編譯時(shí)不會(huì)出現(xiàn),在運(yùn)行時(shí)也不會(huì)出現(xiàn),但在使用不當(dāng)?shù)那闆r下會(huì)出現(xiàn)。比如在java虛擬機(jī)最大可使用內(nèi)存為16m的情況下,不停地給StringBuffer追加字符,這樣子內(nèi)存很快就會(huì)被用光,這樣就會(huì)出現(xiàn)?OutOfMemoryError?異常。

運(yùn)行時(shí)異常RuntimeException

這種異常通常出現(xiàn)在運(yùn)行時(shí),所以被稱為運(yùn)行時(shí)異常。這種異常在編譯時(shí)不會(huì)出現(xiàn),一旦代碼運(yùn)行,就會(huì)出現(xiàn)異常。比如除零操作,這樣的代碼是可以編譯通過的,但在運(yùn)行的時(shí)候就會(huì)報(bào)錯(cuò)。與除零異常同為運(yùn)行時(shí)異常的還有:空指針異常和下表越界等等。

可查異常 CheckedException

這種異常是必須處理的異常。這種異常通常在編譯時(shí)出現(xiàn)報(bào)錯(cuò),比如之前提到的文件不存在異常。這種異常必須進(jìn)行處理,否則編譯器不會(huì)通過編譯,而處理方式也就是接下來要介紹的?try-catch?語句的使用。

?異常的處理?

在java中,有一組關(guān)鍵字被用來進(jìn)行異常的捕捉,它就是?try?-?catch?-?finally?。代碼如下所示:

 try{
    // 嘗試執(zhí)行的可能會(huì)拋出異常的代碼
 }catch(異常類型1 異常的變量名1){
    // 當(dāng)異常拋出時(shí),根據(jù)異常的類型和變量名執(zhí)行對(duì)應(yīng)的catch語句
    //catch語句用來捕獲異常。
 }catch(異常類型2 異常的變量名2){
    // 程序代碼
 }finally{
    // 不管最終如何,一定要執(zhí)行的語句,一般做清理類型等收尾善后性質(zhì)的工作
    //finally不是必要出現(xiàn)的
 }

此外,還有一組關(guān)鍵字被用來拋出異常,它就是?throws?/?throw?關(guān)鍵字:

如果一個(gè)方法沒有捕獲一個(gè)可查異常,那么該方法必須使用 ?throws ?關(guān)鍵字來聲明。?throws ?關(guān)鍵字放在方法簽名的尾部。

也可以使用 ?throw ?關(guān)鍵字拋出一個(gè)異常,無論它是新實(shí)例化的還是剛捕獲到的。

下面方法的聲明拋出一個(gè) ?RemoteException ?異常:

import java.io.*;
public class className
{
   public void deposit(double amount) throws RemoteException
   {
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

一個(gè)方法可以聲明拋出多個(gè)異常,多個(gè)異常之間用逗號(hào)隔開。

例如,下面的方法聲明拋出 ?RemoteException ?和 ?InsufficientFundsException?:

import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

什么異常需要捕捉

通常錯(cuò)誤,運(yùn)行時(shí)異常和可查異常都可以被捕捉,但是一般情況下只有可查異常需要捕捉(因?yàn)椴徊蹲降脑掃B編譯都過不了)。

小結(jié)

以上就是小編要介紹的java異常有哪幾種的詳細(xì)內(nèi)容。部分內(nèi)容參考了W3Cschool的java手冊(cè)。如果需要更深入的了解java異常,可以前往java手冊(cè)-異常處理進(jìn)行學(xué)習(xí)。


0 人點(diǎn)贊