java敏感异常是什么_java中的异常是什么?
Throwable(所有error和exception的父類:超類)
Java將錯(cuò)誤變成對(duì)象交給異常處理機(jī)制
Error(僅靠程序本身無(wú)法恢復(fù)的嚴(yán)重錯(cuò)誤)
一般是環(huán)境的問題,JVM的問題,并非程序的問題;最典型的就是虛擬機(jī)中運(yùn)行的程序過多,造成的虛擬機(jī)內(nèi)存溢出,虛擬機(jī)錯(cuò)誤,還有系統(tǒng)崩潰之類的,應(yīng)用程序是無(wú)法處理此類錯(cuò)誤的。Error不在我們調(diào)試代碼可以處理的范圍中。
AWTError
ThreadDeath
...? ...
Exception(由java應(yīng)用程序拋出和處理的非嚴(yán)重型錯(cuò)誤)
Checked異常(檢查時(shí)異常),程序必須處理的異常(代碼調(diào)用,調(diào)用方聲明有風(fēng)險(xiǎn))
SQLException
ClassNotFoundException
......
例如文件調(diào)用:I/O 有可能找不到的風(fēng)險(xiǎn)
對(duì)于以上的文件讀取可能發(fā)生的異常我們有兩種處理方式:
1.??? 拋出,繼續(xù)往上拋
2.??? 現(xiàn)場(chǎng)處理這個(gè)異常
運(yùn)行時(shí)異常,不要求程序必須對(duì)它們做出處理(運(yùn)行時(shí)才能拋出異常)
RuntimeException(運(yùn)行時(shí)錯(cuò)誤)
NullPointerException
對(duì)象沒有被初始化生成的
NumberFormatException
ArrayIndexOutOfBoundsException數(shù)組越界錯(cuò)誤
......
ArithmeticExecption
數(shù)學(xué)異常(類似除零錯(cuò)誤):
Java中的異常處理是通過5個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:
捕獲
try: 執(zhí)行可能產(chǎn)生異常的代碼
Catch:
異常捕獲
Finally:
無(wú)論是否發(fā)生異??偰軋?zhí)行的代碼
拋出
Throw:
手動(dòng)拋出異常
Throws:
聲明方法可能要拋出的各種異常
使用try、catch、finally的三種情況:
1.程序正常運(yùn)行(不經(jīng)過catch):
2.程序發(fā)生異常,經(jīng)過catch且異常匹配:
3.程序發(fā)生異常,但是不能被catch和catch的不匹配:
如果出現(xiàn)不能被catch那么程序就會(huì)報(bào)錯(cuò),將異常往上拋,拋給JVM。
上面講的是一段代碼只有一種異常的最簡(jiǎn)單的情況;更多的時(shí)候一段代碼不止一種異常:
這里的try中有多行代碼,可能出現(xiàn)的異常有多種:數(shù)學(xué)異常,String字符串的空指針異常,在try中如果出現(xiàn)了異常時(shí),會(huì)在catch中尋找對(duì)應(yīng)可以解決的catch塊,但是如果將exception放在三個(gè)catch的最前面,就會(huì)報(bào)錯(cuò),因?yàn)閑xception是所有異常的超類,出現(xiàn)異常必然會(huì)進(jìn)入到exception中,后面的兩個(gè)catch就會(huì)失效了
使用throw和throws:
在java本身的語(yǔ)法中就是對(duì)異常執(zhí)行拋出的動(dòng)作,java本身的語(yǔ)法 會(huì)把異常一層一層的往上拋,方法中出現(xiàn)了異常,則會(huì)把異常拋給調(diào)用它的主函數(shù),主函數(shù)無(wú)法解決,就會(huì)把異常再次往上拋出,最后拋到JVM導(dǎo)致JVM死掉。
使用throws拋出的運(yùn)行時(shí)異常相當(dāng)于提示調(diào)用者,該方法有風(fēng)險(xiǎn),至于是否處理該風(fēng)險(xiǎn),由調(diào)用者決定;如果throws拋出的是檢查時(shí)異常,那么調(diào)用者自己就必須在調(diào)用的時(shí)候進(jìn)行處理(利用try ... catch),當(dāng)然通過throws可以同時(shí)拋出多個(gè)異常.
------------------------------異常案例------------------------------------
packagejavaexception;
publicclassExceptionTest1{
publicstaticvoidmain(String[]args){
Workerworker=newWorker();
try{
worker.work(11);
}catch(Exceptione){
Doctordoctor=newDoctor();
try{
doctor.cure(worker);
System.out.println("治好了");
}catch(Exceptione1){
System.out.println("die");
}
}
}
}
classWorker{
privatebooleanalive=true;
publicbooleanisAlive(){
returnalive;
}
publicvoidsetAlive(booleanalive){
this.alive=alive;
}
//工作的方法
publicvoidwork(intcount)throwsException{
if(count>10){
thrownewException("生病");
}else{
System.out.println("正常工作");
}
}
}
classDoctor{
publicvoidcure(Workerworker)throwsException{
intt=(int)(Math.random()*10000);
if(t==4512){
worker.setAlive(false);
thrownewException("death");
}else{
worker.setAlive(true);
}
}
}
--------------------------------------------
運(yùn)行時(shí)異常:
捕獲:
特別提醒:在try... catch...? finally中 finally最好不省略,因?yàn)閒inally是保證程序是否發(fā)生異常,都必須執(zhí)行的代碼(即使我們?cè)趖ry塊中強(qiáng)行return之后,finally中依然會(huì)執(zhí)行),(例如我們?cè)贗/O流里面,必須做的關(guān)閉操作就應(yīng)該放在finally中)||需要強(qiáng)調(diào)的是:唯一能終止finally執(zhí)行的操作就是System.exit(0);及其它相關(guān)類似操作,這一類操作是直接終止程序的運(yùn)行,關(guān)閉JVM。
如果在finally中發(fā)生異常的話,照樣也會(huì)程序中斷,因?yàn)闆]有人處理這個(gè)異常。
拋出:
Throw表示手動(dòng)拋出一個(gè)異常,throws是聲明該方法可能會(huì)拋出的異常(運(yùn)行時(shí)異常調(diào)用者不用必須處理;只是知道這里會(huì)拋出這樣一個(gè)異常)
檢查時(shí)異常:
捕獲:
printStackTrace是打印異常堆棧,但是一般我們不建議打印異常堆棧(IDE工具里JVM默認(rèn)生成的),具體問題具體處理,一層一層的打印堆棧是比較耗性能的。
拋出:
如果拋出的是檢查時(shí)異常那么就必須被處理,要么在手動(dòng)拋出的地方立馬用try?catch進(jìn)行處理,要么繼續(xù)往上拋,拋給調(diào)用這個(gè)方法的方法或者主函數(shù),如下例:
總結(jié)
以上是生活随笔為你收集整理的java敏感异常是什么_java中的异常是什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java类变量什么时候初始化_Java类
- 下一篇: vuex 源码分析_前端入门之(vuex
