異常是程序中的一些錯(cuò)誤浴骂,但并不是所有的錯(cuò)誤都是異常度宦,并且錯(cuò)誤有時(shí)候是可以避免的。
比如說(shuō)童社,你的代碼少了一個(gè)分號(hào)求厕,那么運(yùn)行出來(lái)結(jié)果是提示是錯(cuò)誤 java.lang.Error;如果你用System.out.println(11/0)扰楼,那么你是因?yàn)槟阌?做了除數(shù)呀癣,會(huì)拋出 java.lang.ArithmeticException 的異常。
異常發(fā)生的原因有很多灭抑,通常包含以下幾大類(lèi):
用戶(hù)輸入了非法數(shù)據(jù)十艾。
要打開(kāi)的文件不存在。
網(wǎng)絡(luò)通信時(shí)連接中斷腾节,或者JVM內(nèi)存溢出忘嫉。
這些異常有的是因?yàn)橛脩?hù)錯(cuò)誤引起,有的是程序錯(cuò)誤引起的案腺,還有其它一些是因?yàn)槲锢礤e(cuò)誤引起的庆冕。-
要理解Java異常處理是如何工作的,你需要掌握以下三種類(lèi)型的異常:
檢查性異常:最具代表的檢查性異常是用戶(hù)錯(cuò)誤或問(wèn)題引起的異常劈榨,這是程序員無(wú)法預(yù)見(jiàn)的访递。例如要打開(kāi)一個(gè)不存在文件時(shí),一個(gè)異常就發(fā)生了同辣,這些異常在編譯時(shí)不能被簡(jiǎn)單地忽略拷姿。
運(yùn)行時(shí)異常: 運(yùn)行時(shí)異常是可能被程序員避免的異常。與檢查性異常相反旱函,運(yùn)行時(shí)異诚斐玻可以在編譯時(shí)被忽略。
錯(cuò)誤: 錯(cuò)誤不是異常棒妨,而是脫離程序員控制的問(wèn)題踪古。錯(cuò)誤在代碼中通常被忽略。例如券腔,當(dāng)棧溢出時(shí)伏穆,一個(gè)錯(cuò)誤就發(fā)生了,它們?cè)诰幾g也檢查不到的纷纫。
Java 內(nèi)置異常類(lèi)
Java 語(yǔ)言定義了一些異常類(lèi)在 java.lang 標(biāo)準(zhǔn)包中枕扫。
標(biāo)準(zhǔn)運(yùn)行時(shí)異常類(lèi)的子類(lèi)是最常見(jiàn)的異常類(lèi)。由于 java.lang 包是默認(rèn)加載到所有的 Java 程序的辱魁,所以大部分從運(yùn)行時(shí)異常類(lèi)繼承而來(lái)的異常都可以直接使用铡原。
Java 根據(jù)各個(gè)類(lèi)庫(kù)也定義了一些其他的異常偷厦,下面的表中列出了 Java 的非檢查性異常。
異常 描述
ArithmeticException 當(dāng)出現(xiàn)異常的運(yùn)算條件時(shí)燕刻,拋出此異常只泼。例如,一個(gè)整數(shù)"除以零"時(shí)卵洗,拋出此類(lèi)的一個(gè)實(shí)例请唱。
ArrayIndexOutOfBoundsException 用非法索引訪(fǎng)問(wèn)數(shù)組時(shí)拋出的異常。如果索引為負(fù)或大于等于數(shù)組大小过蹂,則該索引為非法索引十绑。
ArrayStoreException 試圖將錯(cuò)誤類(lèi)型的對(duì)象存儲(chǔ)到一個(gè)對(duì)象數(shù)組時(shí)拋出的異常。
ClassCastException 當(dāng)試圖將對(duì)象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類(lèi)時(shí)酷勺,拋出該異常本橙。
IllegalArgumentException 拋出的異常表明向方法傳遞了一個(gè)不合法或不正確的參數(shù)。
IllegalMonitorStateException 拋出的異常表明某一線(xiàn)程已經(jīng)試圖等待對(duì)象的監(jiān)視器脆诉,或者試圖通知其他正在等待對(duì)象的監(jiān)視器而本身沒(méi)有指定監(jiān)視器的線(xiàn)程甚亭。
IllegalStateException 在非法或不適當(dāng)?shù)臅r(shí)間調(diào)用方法時(shí)產(chǎn)生的信號(hào)。換句話(huà)說(shuō)击胜,即 Java 環(huán)境或 Java 應(yīng)用程序沒(méi)有處于請(qǐng)求操作所要求的適當(dāng)狀態(tài)下亏狰。
IllegalThreadStateException 線(xiàn)程沒(méi)有處于請(qǐng)求操作所要求的適當(dāng)狀態(tài)時(shí)拋出的異常。
IndexOutOfBoundsException 指示某排序索引(例如對(duì)數(shù)組偶摔、字符串或向量的排序)超出范圍時(shí)拋出暇唾。
NegativeArraySizeException 如果應(yīng)用程序試圖創(chuàng)建大小為負(fù)的數(shù)組,則拋出該異常辰斋。
NullPointerException 當(dāng)應(yīng)用程序試圖在需要對(duì)象的地方使用 null 時(shí)策州,拋出該異常
NumberFormatException 當(dāng)應(yīng)用程序試圖將字符串轉(zhuǎn)換成一種數(shù)值類(lèi)型,但該字符串不能轉(zhuǎn)換為適當(dāng)格式時(shí)宫仗,拋出該異常够挂。
SecurityException 由安全管理器拋出的異常,指示存在安全侵犯锰什。
StringIndexOutOfBoundsException 此異常由 String 方法拋出,指示索引或者為負(fù)丁逝,或者超出字符串的大小汁胆。
UnsupportedOperationException 當(dāng)不支持請(qǐng)求的操作時(shí),拋出該異常霜幼。
下面的表中列出了 Java 定義在 java.lang 包中的檢查性異常類(lèi)嫩码。