Java異常簡(jiǎn)介
Java異常是Java提供的一種識(shí)別及響應(yīng)錯(cuò)誤的一致性機(jī)制。
Java異常機(jī)制可以使程序中異常處理代碼和正常業(yè)務(wù)代碼分離,保證程序代碼更加優(yōu)雅,并提高程序健壯性。在有效使用異常的情況下,異常能清晰的回答what, where, why這3個(gè)問(wèn)題:異常類型回答了“什么”被拋出,異常堆棧跟蹤回答了“在哪“拋出,異常信息回答了“為什么“會(huì)拋出。
Java異常關(guān)鍵字
? try -- 用于監(jiān)聽(tīng)。將要被監(jiān)聽(tīng)的代碼(可能拋出異常的代碼)放在try語(yǔ)句塊之內(nèi),當(dāng)try語(yǔ)句塊內(nèi)發(fā)生異常時(shí),異常就被拋出。
? catch -- 用于捕獲異常。catch用來(lái)捕獲try語(yǔ)句塊中發(fā)生的異常。
? finally -- finally語(yǔ)句塊總是會(huì)被執(zhí)行。它主要用于回收在try塊里打開的物力資源(如數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接和磁盤文件)。只有finally塊,執(zhí)行完成之后,才會(huì)回來(lái)執(zhí)行try或者catch塊中的return或者throw語(yǔ)句,如果finally中使用了return或者throw等終止方法的語(yǔ)句,則就不會(huì)跳回執(zhí)行,直接停止。
? throw -- 用于拋出異常。
? throws -- 用在方法簽名中,用于聲明該方法可能拋出的異常。
下面通過(guò)幾個(gè)示例對(duì)這幾個(gè)關(guān)鍵字進(jìn)行簡(jiǎn)單了解。
示例一: 了解try和catch基本用法
public class Demo1 {
public static void main(String[] args) {
try {
int i = 10/0;
System.out.println("i="+i);
} catch (ArithmeticException e) {
System.out.println("Caught Exception");
System.out.println("e.getMessage(): " + e.getMessage());
System.out.println("e.toString(): " + e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果:
Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:6)
結(jié)果說(shuō)明:在try語(yǔ)句塊中有除數(shù)為0的操作,該操作會(huì)拋出java.lang.ArithmeticException異常。通過(guò)catch,對(duì)該異常進(jìn)行捕獲。
觀察結(jié)果我們發(fā)現(xiàn),并沒(méi)有執(zhí)行System.out.println("i="+i)。這說(shuō)明try語(yǔ)句塊發(fā)生異常之后,try語(yǔ)句塊中的剩余內(nèi)容就不會(huì)再被執(zhí)行了。
示例二: 了解finally的基本用法
在"示例一"的基礎(chǔ)上,我們添加finally語(yǔ)句。
public class Demo2 {
public static void main(String[] args) {
try {
int i = 10/0;
System.out.println("i="+i);
} catch (ArithmeticException e) {
System.out.println("Caught Exception");
System.out.println("e.getMessage(): " + e.getMessage());
System.out.println("e.toString(): " + e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
} finally {
System.out.println("run finally");
}
}
}
運(yùn)行結(jié)果:
Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
at Demo2.main(Demo2.java:6)
run finally
結(jié)果說(shuō)明:最終執(zhí)行了finally語(yǔ)句塊。
示例三: 了解throws和throw的基本用法
throws是用于在方法聲明拋出的異常,而throw是用于拋出異常。
class MyException extends Exception {
public MyException() {}
public MyException(String msg) {
super(msg);
}
}
public class Demo3 {
public static void main(String[] args) {
try {
test();
} catch (MyException e) {
System.out.println("Catch My Exception");
e.printStackTrace();
}
}
public static void test() throws MyException{
try {
int i = 10/0;
System.out.println("i="+i);
} catch (ArithmeticException e) {
throw new MyException("This is MyException");
}
}
}
運(yùn)行結(jié)果:
Catch My Exception
MyException: This is MyException
at Demo3.test(Demo3.java:24)
at Demo3.main(Demo3.java:13)
結(jié)果說(shuō)明:
MyException是繼承于Exception的子類。test()的try語(yǔ)句塊中產(chǎn)生ArithmeticException異常(除數(shù)為0),并在catch中捕獲該異常,接著拋出MyException異常。main()方法對(duì)test()中拋出的MyException進(jìn)行捕獲處理。
Java異常架構(gòu)

1. Throwable
Throwable 是 Java 語(yǔ)言中所有錯(cuò)誤與異常的超類。
Throwable 包含兩個(gè)子類: Error(錯(cuò)誤)和 Exception(異常)它們通常用于指示發(fā)生了異常情況。
Throwable 包含了其線程創(chuàng)建時(shí)線程執(zhí)行堆棧的快照,它提供了 printStackTrace() 等接口用于獲取堆棧跟蹤數(shù)據(jù)等信息。
2. Error(錯(cuò)誤)
定義:Error 類及其子類。程序中無(wú)法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中出現(xiàn)了嚴(yán)重的錯(cuò)誤。
特點(diǎn):此類錯(cuò)誤一般表示代碼運(yùn)行時(shí) JVM 出現(xiàn)問(wèn)題。通常有 Virtual MachineError(虛擬機(jī)運(yùn)行錯(cuò)誤)、NoClassDefFoundError(類定義錯(cuò)誤)等。比如 OutOfMemoryError:內(nèi)存不足錯(cuò)誤;StackOverflowError:棧溢出錯(cuò)誤。此類錯(cuò)誤發(fā)生時(shí),JVM 將終止線程。
這些錯(cuò)誤是不受檢異常,非代碼性錯(cuò)誤。因此,當(dāng)此類錯(cuò)誤發(fā)生時(shí),應(yīng)用程序不應(yīng)該去處理此類錯(cuò)誤。按照J(rèn)ava慣例,我們是不應(yīng)該是實(shí)現(xiàn)任何新的Error子類的!
3. Exception(異常)
程序本身可以捕獲并且可以處理的異常。Exception 這種異常又分為兩類:運(yùn)行時(shí)異常和編譯時(shí)異常。
3.1 運(yùn)行時(shí)異常
定義:RuntimeException 類極其子類,表示 JVM 在運(yùn)行期間可能出現(xiàn)的錯(cuò)誤。
特點(diǎn):Java 編譯器不會(huì)檢查它。也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常時(shí),倘若既"沒(méi)有通過(guò)throws聲明拋出它",也"沒(méi)有用try-catch語(yǔ)句捕獲它",還是會(huì)編譯通過(guò)。比如NullPointerException空指針異常、ArrayIndexOutBoundException數(shù)組下標(biāo)越界異常、ClassCastException類型轉(zhuǎn)換異常、ArithmeticExecption算術(shù)異常。此類異常屬于不受檢異常,一般是由程序邏輯錯(cuò)誤引起的,在程序中可以選擇捕獲處理,也可以不處理。雖然 Java 編譯器不會(huì)檢查運(yùn)行時(shí)異常,但是我們也可以通過(guò) throws 進(jìn)行聲明拋出,也可以通過(guò) try-catch 對(duì)它進(jìn)行捕獲處理。如果產(chǎn)生運(yùn)行時(shí)異常,則需要通過(guò)修改代碼來(lái)進(jìn)行避免。例如,若會(huì)發(fā)生除數(shù)為零的情況,則需要通過(guò)代碼避免該情況的發(fā)生!
RuntimeException 異常會(huì)由 Java 虛擬機(jī)自動(dòng)拋出并自動(dòng)捕獲(就算我們沒(méi)寫異常捕獲語(yǔ)句運(yùn)行時(shí)也會(huì)拋出錯(cuò)誤!?。?/strong>,此類異常的出現(xiàn)絕大數(shù)情況是代碼本身有問(wèn)題應(yīng)該從邏輯上去解決并改進(jìn)代碼。
3.2 編譯時(shí)異常
定義: Exception 中除 RuntimeException 極其子類之外的異常。
特點(diǎn): Java 編譯器會(huì)檢查它。如果程序中出現(xiàn)此類異常,比如 ClassNotFoundException(沒(méi)有找到指定的類異常),IOException(IO流異常),要么通過(guò)throws進(jìn)行聲明拋出,要么通過(guò)try-catch進(jìn)行捕獲處理,否則不能通過(guò)編譯。在程序中,通常不會(huì)自定義該類異常,而是直接使用系統(tǒng)提供的異常類。該異常我們必須手動(dòng)在代碼里添加捕獲語(yǔ)句來(lái)處理該異常。
4. 受檢異常與不受檢異常
Java 的所有異??梢苑譃槭軝z異常(checked exception)和不受檢異常(unchecked exception)。
4.1 受檢異常
編譯器要求必須處理的異常。正確的程序在運(yùn)行過(guò)程中,經(jīng)常容易出現(xiàn)的、符合預(yù)期的異常情況。一旦發(fā)生此類異常,就必須采用某種方式進(jìn)行處理。除 RuntimeException 及其子類外,其他的 Exception 異常都屬于受檢異常。編譯器會(huì)檢查此類異常,也就是說(shuō)當(dāng)編譯器檢查到應(yīng)用中的某處可能會(huì)此類異常時(shí),將會(huì)提示你處理本異?!词褂胻ry-catch捕獲,要么使用方法簽名中用 throws 關(guān)鍵字拋出,否則編譯不通過(guò)。
4.2 不受檢異常
編譯器不會(huì)進(jìn)行檢查并且不要求必須處理的異常,也就說(shuō)當(dāng)程序中出現(xiàn)此類異常時(shí),即使我們沒(méi)有try-catch捕獲它,也沒(méi)有使用throws拋出該異常,編譯也會(huì)正常通過(guò)。該類異常包括運(yùn)行時(shí)異常(RuntimeException極其子類)和錯(cuò)誤(Error)。
異常處理流程
在Java應(yīng)用中,異常的處理機(jī)制分為拋出異常和捕獲異常。
1. 拋出異常
當(dāng)一個(gè)方法出現(xiàn)錯(cuò)誤而引發(fā)異常時(shí),該方法會(huì)將該異常類型以及異常出現(xiàn)時(shí)的程序狀態(tài)信息封裝為異常對(duì)象,并交給本應(yīng)用。運(yùn)行時(shí),該應(yīng)用將尋找處理異常的代碼并執(zhí)行。任何代碼都可以通過(guò)throw關(guān)鍵詞拋出異常,比如Java源代碼拋出異常、自己編寫的代碼拋出異常等。
2. 捕獲異常
一旦方法拋出異常,系統(tǒng)自動(dòng)根據(jù)該異常對(duì)象尋找合適異常處理器(Exception Handler)來(lái)處理該異常。所謂合適類型的異常處理器指的是異常對(duì)象類型和異常處理器類型一致。
對(duì)于不同的異常,Java采用不同的異常處理方式:
1、運(yùn)行時(shí)異常將由系統(tǒng)自動(dòng)拋出,應(yīng)用本身可以選擇處理或者忽略該異常。
2、對(duì)于方法中產(chǎn)生的 Error,該異常一旦發(fā)生 JVM 將自行處理該異常,因此 Java 允許應(yīng)用不拋出此類異常。
3、對(duì)于所有的受檢異常,必須進(jìn)行捕獲或者拋出該方法之外交給上層處理。也就是當(dāng)一個(gè)方法存在異常時(shí),要么使用try-catch捕獲,要么使用該方法使用throws將該異常拋調(diào)用該方法的上層調(diào)用者。
3. 異常的拋出與捕獲
3.1 直接拋出異常
通常,應(yīng)該捕獲那些知道如何處理的異常,將不知道如何處理的異常繼續(xù)傳遞下去。傳遞異常可以在方法簽名處使用 throws 關(guān)鍵字聲明可能會(huì)拋出的異常。
private static void readFile(String filePath) throws IOException {
File file = new File(filePath);
String result;
BufferedReader reader = new BufferedReader(new FileReader(file));
while((result = reader.readLine())!=null) {
System.out.println(result);
}
reader.close();
}
3.2 封裝異常再拋出
有時(shí)我們會(huì)從 catch 中拋出一個(gè)異常,目的是為了改變異常的類型。多用于在多系統(tǒng)集成時(shí),當(dāng)某個(gè)子系統(tǒng)故障,異常類型可能有多種,可以用統(tǒng)一的異常類型向外暴露,不需暴露太多內(nèi)部異常細(xì)節(jié)。
private static void readFile(String filePath) throws MyException {
try {
// code
} catch (IOException e) {
MyException ex = new MyException("read file failed.");
ex.initCause(e);
throw ex;
}
}
3.3 捕獲異常
在一個(gè) try-catch 語(yǔ)句塊中可以捕獲多個(gè)異常類型,并對(duì)不同類型的異常做出不同的處理
private static void readFile(String filePath) {
try {
// code
} catch (FileNotFoundException e) {
// handle FileNotFoundException
} catch (IOException e){
// handle IOException
}
}
同一個(gè) catch 也可以捕獲多種類型異常,用 | 隔開
private static void readFile(String filePath) {
try {
// code
} catch (FileNotFoundException | UnknownHostException e) {
// handle FileNotFoundException or UnknownHostException
} catch (IOException e){
// handle IOException
}
}
3.4 自定義異常
習(xí)慣上,定義一個(gè)異常類應(yīng)包含兩個(gè)構(gòu)造函數(shù),一個(gè)無(wú)參構(gòu)造函數(shù)和一個(gè)帶有詳細(xì)描述信息的構(gòu)造函數(shù)(Throwable 的 toString 方法會(huì)打印這些詳細(xì)信息,調(diào)試時(shí)很有用)
public class MyException extends Exception {
public MyException(){ }
public MyException(String msg){
super(msg);
}
// ...
}
3.5 try-catch-finally
當(dāng)方法中發(fā)生異常,異常處之后的代碼不會(huì)再執(zhí)行,如果之前獲取了一些本地資源需要釋放,則需要在方法正常結(jié)束時(shí)和 catch 語(yǔ)句中都調(diào)用釋放本地資源的代碼,顯得代碼比較繁瑣,finally 語(yǔ)句可以解決這個(gè)問(wèn)題。
private static void readFile(String filePath) throws MyException {
File file = new File(filePath);
String result;
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
while((result = reader.readLine())!=null) {
System.out.println(result);
}
} catch (IOException e) {
System.out.println("readFile method catch block.");
MyException ex = new MyException("read file failed.");
ex.initCause(e);
throw ex;
} finally {
System.out.println("readFile method finally block.");
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
調(diào)用該方法時(shí),讀取文件時(shí)若發(fā)生異常,代碼會(huì)進(jìn)入 catch 代碼塊,之后進(jìn)入 finally 代碼塊;若讀取文件時(shí)未發(fā)生異常,則會(huì)跳過(guò) catch 代碼塊直接進(jìn)入 finally 代碼塊。所以無(wú)論代碼中是否發(fā)生異常,fianlly 中的代碼都會(huì)執(zhí)行。
若 catch 代碼塊中包含 return 語(yǔ)句,finally 中的代碼還會(huì)執(zhí)行嗎?將以上代碼中的 catch 子句修改如下:
catch (IOException e) {
System.out.println("readFile method catch block.");
return;
}
調(diào)用 readFile 方法,觀察當(dāng) catch 子句中調(diào)用 return 語(yǔ)句時(shí),finally 子句是否執(zhí)行
readFile method catch block.
readFile method finally block.
可見(jiàn),即使 catch 中包含了 return 語(yǔ)句,finally 子句依然會(huì)執(zhí)行。若 finally 中也包含 return 語(yǔ)句,finally 中的 return 會(huì)覆蓋前面的 return.
3.6 try-with-resource
上面例子中,finally 中的 close 方法也可能拋出 IOException, 從而覆蓋了原始異常。JAVA 7 提供了更優(yōu)雅的方式來(lái)實(shí)現(xiàn)資源的自動(dòng)釋放,自動(dòng)釋放的資源需要是實(shí)現(xiàn)了 AutoCloseable 接口的類。
private static void tryWithResourceTest(){
try (Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
// code
} catch (IOException e){
// handle exception
}
}
try 代碼塊退出時(shí),會(huì)自動(dòng)調(diào)用 scanner.close 方法,和把 scanner.close 方法放在 finally 代碼塊中不同的是,若 scanner.close 拋出異常,則會(huì)被抑制,拋出的仍然為原始異常。被抑制的異常會(huì)由 addSusppressed 方法添加到原來(lái)的異常,如果想要獲取被抑制的異常列表,可以調(diào)用 getSuppressed 方法來(lái)獲取。
如何選擇異常類型
1. 如何選擇異常
從個(gè)人開發(fā)經(jīng)驗(yàn)來(lái)看,如果在一個(gè)應(yīng)用中,需要開發(fā)一個(gè)方法(如某個(gè)功能的service方法),這個(gè)方法如果中間可能出現(xiàn)異常,那么你需要考慮這個(gè)異常出現(xiàn)之后是否調(diào)用者可以處理,并且你是否希望調(diào)用者進(jìn)行處理。
如果調(diào)用者可以處理,并且你也希望調(diào)用者進(jìn)行處理,那么就要拋出受檢異常,提醒調(diào)用者在使用你的方法時(shí),考慮到如果拋出異常時(shí)如果進(jìn)行處理。
相似的,如果在寫某個(gè)方法時(shí),你認(rèn)為這是個(gè)偶然異常,理論上說(shuō),你覺(jué)得運(yùn)行時(shí)可能會(huì)碰到什么問(wèn)題,而這些問(wèn)題也許不是必然發(fā)生的,也不需要調(diào)用者顯示的通過(guò)異常來(lái)判斷業(yè)務(wù)流程操作的,那么這時(shí)就可以使用一個(gè)RuntimeException這樣的非受檢異常。
2. 應(yīng)該選用哪種異常
RuntimeException異常和受檢異常之間的區(qū)別就是:是否強(qiáng)制要求調(diào)用者必須處理此異常,如果強(qiáng)制要求調(diào)用者必須進(jìn)行處理,那么就使用受檢異常,否則就選擇非受檢異常(RuntimeException)。一般來(lái)講,如果沒(méi)有特殊的要求,我們建議使用RuntimeException異常。
3. 什么時(shí)候才需要拋異常
首先我們需要了解一個(gè)問(wèn)題,什么時(shí)候才需要拋異常?異常的設(shè)計(jì)是方便給開發(fā)者使用的,但不是亂用的。
其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,如果你覺(jué)得某些”問(wèn)題”解決不了了,那么你就可以拋出異常了。比如,你在寫一個(gè)service,其中在寫到某段代碼處,你發(fā)現(xiàn)可能會(huì)產(chǎn)生問(wèn)題,那么就請(qǐng)拋出異常吧,相信我,你此時(shí)拋出異常將是一個(gè)最佳時(shí)機(jī)。
常見(jiàn)問(wèn)題
1. Error 和 Exception 區(qū)別是什么?
Error 類型的錯(cuò)誤通常為虛擬機(jī)相關(guān)錯(cuò)誤,如系統(tǒng)崩潰,內(nèi)存不足,堆棧溢出等,編譯器不會(huì)對(duì)這類錯(cuò)誤進(jìn)行檢測(cè),JAVA 應(yīng)用程序也不應(yīng)對(duì)這類錯(cuò)誤進(jìn)行捕獲,一旦這類錯(cuò)誤發(fā)生,通常應(yīng)用程序會(huì)被終止,僅靠應(yīng)用程序本身無(wú)法恢復(fù);
Exception 類的錯(cuò)誤是可以在應(yīng)用程序中進(jìn)行捕獲并處理的,通常遇到這種錯(cuò)誤,應(yīng)對(duì)其進(jìn)行處理,使應(yīng)用程序可以繼續(xù)正常運(yùn)行。
2. 運(yùn)行時(shí)異常和一般異常區(qū)別是什么?
編譯器不會(huì)對(duì)運(yùn)行時(shí)異常進(jìn)行檢測(cè),沒(méi)有 try-catch,方法簽名中也沒(méi)有 throws 關(guān)鍵字聲明,編譯依然可以通過(guò)。如果出現(xiàn)了 RuntimeException, 那一定是程序員的錯(cuò)誤。
一般一場(chǎng)如果沒(méi)有 try-catch,且方法簽名中也沒(méi)有用 throws 關(guān)鍵字聲明可能拋出的異常,則編譯無(wú)法通過(guò)。這類異常通常為應(yīng)用環(huán)境中的錯(cuò)誤,即外部錯(cuò)誤,非應(yīng)用程序本身錯(cuò)誤,如文件找不到等。
3.NoClassDefFoundError 和 ClassNotFoundException 區(qū)別?
NoClassDefFoundError 是一個(gè) Error 類型的異常,是由 JVM 引起的,不應(yīng)該嘗試捕獲這個(gè)異常。
引起該異常的原因是 JVM 或 ClassLoader 嘗試加載某類時(shí)在內(nèi)存中找不到該類的定義,該動(dòng)作發(fā)生在運(yùn)行期間,即編譯時(shí)該類存在,但是在運(yùn)行時(shí)卻找不到了,可能是變異后被刪除了等原因?qū)е拢?/p>
ClassNotFoundException 是一個(gè)受查異常,需要顯式地使用 try-catch 對(duì)其進(jìn)行捕獲和處理,或在方法簽名中用 throws 關(guān)鍵字進(jìn)行聲明。當(dāng)使用 Class.forName, ClassLoader.loadClass 或 ClassLoader.findSystemClass 動(dòng)態(tài)加載類到內(nèi)存的時(shí)候,通過(guò)傳入的類路徑參數(shù)沒(méi)有找到該類,就會(huì)拋出該異常;另一種拋出該異常的可能原因是某個(gè)類已經(jīng)由一個(gè)類加載器加載至內(nèi)存中,另一個(gè)加載器又嘗試去加載它。
4. JVM 是如何處理異常的?
在一個(gè)方法中如果發(fā)生異常,這個(gè)方法會(huì)創(chuàng)建一個(gè)一場(chǎng)對(duì)象,并轉(zhuǎn)交給 JVM,該異常對(duì)象包含異常名稱,異常描述以及異常發(fā)生時(shí)應(yīng)用程序的狀態(tài)。創(chuàng)建異常對(duì)象并轉(zhuǎn)交給 JVM 的過(guò)程稱為拋出異常??赡苡幸幌盗械姆椒ㄕ{(diào)用,最終才進(jìn)入拋出異常的方法,這一系列方法調(diào)用的有序列表叫做調(diào)用棧。
JVM 會(huì)順著調(diào)用棧去查找看是否有可以處理異常的代碼,如果有,則調(diào)用異常處理代碼。當(dāng) JVM 發(fā)現(xiàn)可以處理異常的代碼時(shí),會(huì)把發(fā)生的異常傳遞給它。如果 JVM 沒(méi)有找到可以處理該異常的代碼塊,JVM 就會(huì)將該異常轉(zhuǎn)交給默認(rèn)的異常處理器(默認(rèn)處理器為 JVM 的一部分),默認(rèn)異常處理器打印出異常信息并終止應(yīng)用程序。
5. throw 和 throws 的區(qū)別是什么?
throw 關(guān)鍵字用來(lái)拋出方法或代碼塊中的異常,受查異常和非受查異常都可以被拋出。
throws 關(guān)鍵字用在方法簽名處,用來(lái)標(biāo)識(shí)該方法可能拋出的異常列表。一個(gè)方法用 throws 標(biāo)識(shí)了可能拋出的異常列表,調(diào)用該方法的方法中必須包含可處理異常的代碼,否則也要在方法簽名中用 throws 關(guān)鍵字聲明相應(yīng)的異常。
6. 常見(jiàn)的 RuntimeException 有哪些?
- ClassCastException(類轉(zhuǎn)換異常)
- IndexOutOfBoundsException(數(shù)組越界)
- NullPointerException(空指針)
- ArrayStoreException(數(shù)據(jù)存儲(chǔ)異常,操作數(shù)組時(shí)類型不一致)
- 還有IO操作的BufferOverflowException異常
常見(jiàn)異常
java.lang.IllegalAccessError:違法訪問(wèn)錯(cuò)誤。當(dāng)一個(gè)應(yīng)用試圖訪問(wèn)、修改某個(gè)類的域(Field)或者調(diào)用其方法,但是又違反域或方法的可見(jiàn)性聲明,則拋出該異常。
java.lang.InstantiationError:實(shí)例化錯(cuò)誤。當(dāng)一個(gè)應(yīng)用試圖通過(guò)Java的new操作符構(gòu)造一個(gè)抽象類或者接口時(shí)拋出該異常.
java.lang.OutOfMemoryError:內(nèi)存不足錯(cuò)誤。當(dāng)可用內(nèi)存不足以讓Java虛擬機(jī)分配給一個(gè)對(duì)象時(shí)拋出該錯(cuò)誤。
java.lang.StackOverflowError:堆棧溢出錯(cuò)誤。當(dāng)一個(gè)應(yīng)用遞歸調(diào)用的層次太深而導(dǎo)致堆棧溢出或者陷入死循環(huán)時(shí)拋出該錯(cuò)誤。
java.lang.ClassCastException:類造型異常。假設(shè)有類A和B(A不是B的父類或子類),O是A的實(shí)例,那么當(dāng)強(qiáng)制將O構(gòu)造為類B的實(shí)例時(shí)拋出該異常。該異常經(jīng)常被稱為強(qiáng)制類型轉(zhuǎn)換異常。
java.lang.ClassNotFoundException:找不到類異常。當(dāng)應(yīng)用試圖根據(jù)字符串形式的類名構(gòu)造類,而在遍歷CLASSPAH之后找不到對(duì)應(yīng)名稱的class文件時(shí),拋出該異常。
java.lang.ArithmeticException:算術(shù)條件異常。譬如:整數(shù)除零等。
java.lang.ArrayIndexOutOfBoundsException:數(shù)組索引越界異常。當(dāng)對(duì)數(shù)組的索引值為負(fù)數(shù)或大于等于數(shù)組大小時(shí)拋出。
java.lang.IndexOutOfBoundsException:索引越界異常。當(dāng)訪問(wèn)某個(gè)序列的索引值小于0或大于等于序列大小時(shí),拋出該異常。
java.lang.InstantiationException:實(shí)例化異常。當(dāng)試圖通過(guò)newInstance()方法創(chuàng)建某個(gè)類的實(shí)例,而該類是一個(gè)抽象類或接口時(shí),拋出該異常。
java.lang.NoSuchFieldException:屬性不存在異常。當(dāng)訪問(wèn)某個(gè)類的不存在的屬性時(shí)拋出該異常。
java.lang.NoSuchMethodException:方法不存在異常。當(dāng)訪問(wèn)某個(gè)類的不存在的方法時(shí)拋出該異常。
java.lang.NullPointerException:空指針異常。當(dāng)應(yīng)用試圖在要求使用對(duì)象的地方使用了null時(shí),拋出該異常。譬如:調(diào)用null對(duì)象的實(shí)例方法、訪問(wèn)null對(duì)象的屬性、計(jì)算null對(duì)象的長(zhǎng)度、使用throw語(yǔ)句拋出null等等。
java.lang.NumberFormatException:數(shù)字格式異常。當(dāng)試圖將一個(gè)String轉(zhuǎn)換為指定的數(shù)字類型,而該字符串確不滿足數(shù)字類型要求的格式時(shí),拋出該異常。
java.lang.StringIndexOutOfBoundsException:字符串索引越界異常。當(dāng)使用索引值訪問(wèn)某個(gè)字符串中的字符,而該索引值小于0或大于等于序列大小時(shí),拋出該異常。