在Java中的異常(Exception)和錯誤(Error)

BAZsJMo74Rj3KCH.png

一、異常(Exception)

1. 引入:

什么是異常:

public static void main(String[] args) {
    int i=1,j=0;
    int sum = i/j;
    System.out.println(sum);
}

上面的代碼紫皇,在寫的時候沒有什么問題,但是點擊運行腋寨,就會報出這樣一段結(jié)果:


image-20220808174154722.png

因為j是為0的聪铺,不能作為除數(shù),點擊運行就出現(xiàn)了算數(shù)異常萄窜。

另一種情況:


image-20220808175045970.png

這種在我們寫代碼時出現(xiàn)的紅色下劃線计寇,它向我們提示

Unhandled exception: java.io.FileNotFoundException

當前的代碼可能會出現(xiàn)找不到文件的異常

2. 什么是異常:

異常是Exception,是程序的運行期間發(fā)生了不尋常的事情脂倦。

異撤可以通過編寫人員編寫程序解決的。

3. 為什么要處理異常:

如果我們不處理掉異常赖阻,那么程序就不能正常的運行蝶押,因此我們需要處理掉異常。

4. 異常的兩種情況:

由引入我們知道火欧,異常是有兩種情況的棋电,分別是:

  1. 編譯時異常(也叫做checked異常):checked異常即是受檢查的異常,在編譯過程中苇侵,如果沒有被catch或者throws關鍵字處理的話赶盔,就沒有辦法通過編譯

  2. 運行時異常(也叫unchecked異常):是在運行期間發(fā)生的異常。

    Runtime Exception 運行時異常榆浓。

    unchecked異常即是不受檢查的異常于未,在編譯過程中,我們即使不處理也能正常通過編譯陡鹃,但是在運行時會報出異常烘浦。

    RuntimeException 及其子類都統(tǒng)稱為非受檢查異常,常見的有:

    • NullPointerException(空指針異常)
    • IllegalArgumentException(參數(shù)異常萍鲸,比如方法傳入?yún)㈩愋彤惓?
    • NumberFormatException(字符串轉(zhuǎn)換為數(shù)字格式異常闷叉,IllegalArgumentException的子類)
    • ArrayIndexOutOfBoundsException(數(shù)組越界異常)
    • ClassCastException(類型轉(zhuǎn)換異常)
    • ArithmeticException(算術異常)
    • SecurityException (安全異常,比如權(quán)限不夠)
    • UnsupportedOperationException(不支持的操作異常脊阴,比如重復創(chuàng)建同一用戶)
    • ......

5. 怎么處理異常

異常處理的兩套辦法

  • 使用try-catch-finally
  • 使用throw-throws

使用try-catch處理異常

try塊中存放可能發(fā)生異常的代碼

catch塊存放處理 異常的代碼

當try塊中發(fā)生異常時握侧,程序立即跳轉(zhuǎn)到catch塊運行,catch塊的作用是捕獲異常嘿期,當異常被捕獲以后品擎,異常就沒有了,所以程序就可以繼續(xù)運行了秽五。

如果try塊中沒有發(fā)生異常孽查,那么程序就不會進入catch塊。

public static void main(String[] args) {
        File file = new File("d:/abc.txt");
        FileOutputStream fs = null;
        try {
            fs = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();//將異常捕獲坦喘,則不再繼續(xù)拋出異常
        }
    }

使用try-catch-finally處理異常

public static void main(String[] args) {
    File file = new File("d:/abc.txt");
    FileOutputStream fs = null;
    try {
        fs = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {
        System.out.println("finally");
    }
}

在這段代碼中盲再,無論是否能找到文件西设,finally都能夠運行,

這說明finally表示無論try中是否出現(xiàn)異常答朋,finally都是要執(zhí)行的贷揽。所喲程序執(zhí)行的路徑是

發(fā)生異常時:try-catch-finally

或者

不發(fā)生異常時:try-finally

那我們可以充分利用finally的特點

finally的作用是什么呢?finally的作用是用于回收系統(tǒng)資源梦碗,比如釋放數(shù)據(jù)庫連接禽绪,斷開網(wǎng)絡等。

此外洪规,catch可以多次使用印屁,沒有先后順序。

使用throws和throw處理異常

public static void main(String[] args) throws FileNotFoundException {
    File file = new File("d:/abc.txt");
    FileOutputStream fs = new FileOutputStream(file);
}

上面代碼將異常通過throws關鍵字向外拋給了虛擬機處理斩例,方法內(nèi)就不出現(xiàn)異常

throw關鍵字可以自己主動拋出一個異常雄人,我們可以借此解決一些日常問題,例如:如果記錄學生成績念赶,成績在0到100之間础钠,超出100或者少于0都不符合我們的要求,這是我們可以用throw處理叉谜。

public static void main(String[] args) {
    try {
        input();
    }catch (RuntimeException e){
        e.printStackTrace();
    }
}

private static void input()throws RuntimeException {
    Scanner scanner = new Scanner(System.in);
    System.out.println("請輸入成績");
    int score = scanner.nextInt();
    if (score>100 || score<0){
        RuntimeException ex= new RuntimeException("成績必須在0到100之間");
        throw ex;
    }
    System.out.println("成績已保存");
}

Throwable對象的常用方法

  • String getMessage(): 返回異常發(fā)生時的簡要描述
  • void printStackTrace(): 在控制臺上打印 Throwable 對象封裝的異常信息
private String message;

public ExceptionAndError(String message) {
    super(message);
    this.message = message;
}
@Override
    public String getMessage() {
        return this.message;
    }//重寫父類getMessage方法
public static void main(String[] args) {
    try {
        input();
    }catch (RuntimeException e){
        e.printStackTrace();
        System.out.println(e.getMessage());
    }
}

在經(jīng)過修改后旗吁,結(jié)果為:


QQ截圖20220808202252.png

二、 錯誤(Error)

錯誤的引入

public class Test {
    public static void main(String[] args) {
        method();
    }

    private static void method() {
        method();
    }
}
1659508989438.png

什么是錯誤

錯誤停局,Error很钓,表示無法通過開發(fā)人員編寫程序來解決的錯誤,稱之為錯誤翻具,錯誤相關的類都是以Error結(jié)尾的履怯。

三、Error與Exception的區(qū)別

在 Java 中裆泳,所有的異常都有一個共同的父類 java.lang 包中的 Throwable 類。Throwable 類有兩個重要的子類:

  • Exception :程序本身可以處理的異常柠硕,可以通過 catch 來進行捕獲工禾。Exception 又可以分為 Checked Exception (受檢查異常,必須處理) 和 Unchecked Exception (不受檢查異常蝗柔,可以不處理)闻葵。
  • ErrorError 屬于程序無法處理的錯誤 ,我們沒辦法通過 catch 來進行捕獲癣丧,不建議通過catch捕獲 槽畔。例如 Java 虛擬機運行錯誤(Virtual MachineError)、虛擬機內(nèi)存不夠錯誤(OutOfMemoryError)胁编、類定義錯誤(NoClassDefFoundError)等 厢钧。這些異常發(fā)生時鳞尔,Java 虛擬機(JVM)一般會選擇線程終止。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末早直,一起剝皮案震驚了整個濱河市寥假,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霞扬,老刑警劉巖糕韧,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喻圃,居然都是意外死亡萤彩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門斧拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雀扶,“玉大人,你說我怎么就攤上這事饮焦∨挛猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵县踢,是天一觀的道長转绷。 經(jīng)常有香客問我,道長硼啤,這世上最難降的妖魔是什么议经? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谴返,結(jié)果婚禮上煞肾,老公的妹妹穿的比我還像新娘。我一直安慰自己嗓袱,他們只是感情好籍救,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渠抹,像睡著了一般蝙昙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梧却,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天奇颠,我揣著相機與錄音,去河邊找鬼放航。 笑死烈拒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荆几,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吓妆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伴郁?” 一聲冷哼從身側(cè)響起耿战,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焊傅,沒想到半個月后剂陡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡狐胎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年鸭栖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握巢。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晕鹊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暴浦,到底是詐尸還是另有隱情溅话,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布歌焦,位于F島的核電站飞几,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏独撇。R本人自食惡果不足惜屑墨,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纷铣。 院中可真熱鬧卵史,春花似錦、人聲如沸搜立。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啄踊。三九已至寸潦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間社痛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工命雀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒜哀,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像撵儿,于是被迫代替她去往敵國和親乘客。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容