一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 深入分析Java異常

深入分析Java異常

2021-05-03 10:51scu醬油仔 Java教程

本篇文章給大家詳細分享了關于Java異常的相關知識點,對此有需要的朋友跟著學習下吧。

java異常分為兩大類,Checked異常和Runtime異常,Checked異常都是在編譯階段可以被處理的異常。

Checked異常和Runtime異常的區別和聯系

  • Checked異常都是可以被處理的異常,在程序中必須顯式地處理Checked異常,如果沒有處理,那么編譯就會報錯。而Runtime異常可以不被顯式的處理;
  • 都是Exception的子類,繼承了RuntimeException的就是Runtime異常,其他的就是Checked異常。

常見異常類

列舉幾個常見的運行時異常RuntimeException:

  • IndexOutOfBoundException:數組越界異常;
  • NullPointerException:空指針異常;
  • ClassCastException:類轉換異常;
  • NumberFormatException:數字格式異常;
  • ArithmeticException:運算異常。

列舉幾個非運行時異常(Checked異常):

  • SQLException:SQL異常;
  • IOException:IO異常;
  • FileNotFoundException:文件找不到異常,是IOException的子類;
  • InterruptedException:中斷異常,一般用在多線程編程;
  • ClassNotFoundException:類找不到。

Error錯誤

Error錯誤一般指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,動態鏈接失敗等,這種錯誤無法恢復或不可被捕獲,將導致應用程序中斷。通常應用程序也無法處理這些錯誤,因此程序中不應該試圖使用catch來捕獲Error對象。在方法定義時,也無需throws Error對象。

Checked異常的使用

前面提到了Checked必須顯式的處理,不然編譯報錯,比如聲明一個文件輸入流:

?
1
FileInputStream fis = new FileInputStream("test.md");

這段代碼編譯會報錯

?
1
Unhandled exception type FileNotFoundException

因此必須顯式的處理它,處理Checked異常的方式一般有兩種:

如果知道如何處理,那么最好使用try…catch...塊處理:

?
1
2
3
4
5
6
7
//Checked異常必須被顯式處理
try {
 FileInputStream fis = new FileInputStream("test.md");
} catch (FileNotFoundException e) {
 e.printStackTrace();
 System.out.println("文件不存在!");
}

如果不知道如何處理,那么就在方法中拋出,由上一級調用者處理:

?
1
2
3
4
5
6
public static void main(String[] args) throws FileNotFoundException {
 
 //Checked異常必須被顯式處理
 //在main方法中拋出異常,交給JVM處理,JVM對異常的處理辦法就是打印跟蹤棧信息,并終止程序運行
 FileInputStream fis = new FileInputStream("test.md");
}

使用throw自行拋出異常

有的時候根據業務需要,我們在程序里面會自行拋出異常,比如如果讀取的文件內容為空,我們就認為這是一個異常,這時候我們可以使用throw來主動拋出異常,并且用catch捕獲它:

?
1
2
3
4
5
6
7
8
9
//使用throw主動拋出異常
try {
 FileInputStream fis = new FileInputStream("test.md");
 if(fis.read() == 0) {
  throw new IOException("空文件");
 }
} catch (IOException e) {
 e.printStackTrace();
}

如果throw拋出的是一個runtime異常,那么程序可以用try…catch…捕獲,也可以不用理會。

異常鏈處理

在真實的企業級應用中,我們往往不會講底層的異常暴露給上層應用,比如不會把SQL異常暴露到用戶界面上。一是對于用戶而言,看到SQL異常對他們也沒啥幫助,二是對于惡意用戶而言,暴露底層異常不安全。

那么如何屏蔽底層異常呢?通常的做法是:程序先捕獲原始異常,然后拋出一個新的業務異常,新的業務異常包含了對用戶的提示信息,這種處理方式成為異常轉譯。下面演示一個創建用戶的程序如何屏蔽底層異常:

?
1
2
3
4
5
6
7
8
9
10
11
12
//演示異常鏈,創建用戶
public void createSubscriber(int subId) throws BusinessException {
 try {
  //創建用戶的邏輯......
 
 }catch(Exception e){
  //處理并保存原始異常...
 
  //拋出新的業務異常
  throw new BusinessException("用戶創建失敗");
 }
}

可以看到程序把原始異常隱藏起來,僅向上提供必要的異常提示信息,可以保證底層異常不會擴展到表現層,這完全符合對象的封裝原則。

這種把捕獲一個異常然后拋出另一個異常,并把原始異常信息保存下來,是一種典型的鏈式處理,在設計模式中被稱為責任鏈模式。

使用異常的幾個建議

我們使用異常是為了實現幾個目標:

  • 使程序代碼混亂最小化;
  • 捕獲并保留診斷信息;
  • 通知合適的人員;
  • 采用合適的方式結束異常活動

針對這些目標,我們應該做到:

1、不要過度使用和依賴它:異常很方便,但是不要把正常的邏輯處理都使用異常處理,比如

?
1
2
3
4
5
6
7
8
9
10
//原始代碼
if(fileSize > 100){
 Sysotem.out.println("文件過大,請重新上傳");
 continue;
}
//改成使用異常
if(fileSize > 100){
 throw new Exception("文件過大,請重新上傳");
}
//這樣做,很明顯不負責任。
  1. 不要在try里面寫很多代碼:這樣可能增加異常分析的難度,并且大量的代碼可能需要大量的catch來捕獲不同的異常;
  2. 避免使用catch來捕獲所有類型的異常:比如catch(Throwable t)或者catch(Exception e)這樣,對所有異常使用同樣的邏輯處理,不得不寫很多if語句處理不同情況,得不償失,并且這種捕獲方式可能將Error、Runtime等可能導致程序終止的異常捕獲,從而“壓制”了異常,一些關鍵異常可能被悄悄忽略;
  3. 不要忽略捕獲到的異常:catch應該做一些有用的事情,不要為空或者只打印異常,catch塊為空就是瞞天過海,程序出了錯誤,所有人看不到任何異常,但是程序可能已經壞了!在捕獲到異常的時候,要么處理它,要么拋出新異常,要么向上拋出并在合適的地方處理異常。

原文鏈接:https://segmentfault.com/a/1190000014929786

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日日舔| 东京干福利 | 激情婷婷综合久久久久 | 亚洲乱亚洲乱妇41p 亚洲乱码一区二区三区国产精品 | 精品久久99麻豆蜜桃666 | 5x视频在线观看 | 亚洲国产在线视频精品 | 国产乱码在线精品可播放 | 国产拍拍 | 久久国产36精品色熟妇 | 国产成人欧美 | 动漫美女被吸乳羞羞小说 | 青青草伊人久久 | 日出水了特别黄的视频 | 欧美男人天堂 | 日本老妇成熟 | 白丝捆绑调教 | 日本aa大片在线播放免费看 | 九二淫黄大片看片 | 美国一级大黄大色毛片 | 成人a级特黄毛片 | 男女一级簧色带 | 无遮挡激情| 国产视频一区 | narutomanga玖辛奈本子 | 男人的天堂视频 | xxxx成人 | 乳 好大h| 国产欧美va欧美va香蕉在线观 | 亚洲男gay | 变态人shou交小说 | caoporm碰最新免费公开视频 | 午夜亚洲精品久久久久久 | 国产一区国产二区国产三区 | 四虎影视免费观看免费观看 | 波多野结衣之高校教师 | 大乳女子一级毛片 | 9966久久精品免费看国产 | 国产欧美日韩在线观看精品 | 菠萝视频在线完整版 | 交换朋友夫妇3中文字幕 |