国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深入探討Java中的異常與錯誤處理

開發 后端
Java中的異常處理機制已經比較成熟,我們的Java程序到處充滿了異常的可能,如果對這些異常不做預先的處理,那么將來程序崩潰就無從調試,很難找到異常所在的位置。本文將探討一下Java中異常與錯誤的處理方法,一起來看看。

 [[190846]]

Java中的異常處理機制已經比較成熟,我們的Java程序到處充滿了異常的可能,如果對這些異常不做預先的處理,那么將來程序崩潰就無從調試,很難找到異常所在的位置。本文將探討一下Java中異常與錯誤的處理方法,一起來看看。

異常與錯誤:

異常:

在Java中程序的錯誤主要是語法錯誤和語義錯誤,一個程序在編譯和運行時出現的錯誤我們統一稱之為異常,它是VM(虛擬機)通知你的一種方式,通過這種方式,VM讓你知道,你(開發人員)已經犯了個錯誤,現在有一個機會來修改它。Java中使用異常類來表示異常,不同的異常類代表了不同的異常。但是在Java中所有的異常都有一個基類,叫做Exception。

錯誤:

它指的是一個合理的應用程序不能截獲的嚴重的問題。大多數都是反常的情況。錯誤是VM的一個故障(雖然它可以是任何系統級的服務)。所以,錯誤是很難處理的,一般的開發人員(當然不是你)是無法處理這些錯誤的,比如內存溢出。 和異常一樣,在Java中用錯誤類來表示錯誤,不同的錯誤類代表了不同的錯誤。 但是在Java中所有的錯誤都有一個基類,叫做Error。

綜上,我們可以知道異常和錯誤最本質的區別就是異常能被開發人員處理而錯誤時系統本來自帶的,一般無法處理也不需要我們程序員來處理。

1.一個異常是在一個程序執行過程中出現的一個事件,它中斷了正常指令的運行

2.錯誤,偏離了可接受的代碼行為的一個動作或實例

異常的結構分類:

1、運行時異常(未檢查異常)

2、編譯時異常(已檢查異常)

運行異常即是RuntimeException;其余的全部為編譯異常

在Java中異常Exception和錯誤Error有個共同的父類Throwable。

Error Exception

runtimeException幾個子類

1、 java.lang.ArrayIndexOutOfBoundsException

數組索引越界異常。當對數組的索引值為負數或大于等于數組大小時拋出。

2、java.lang.ArithmeticException

算術條件異常。譬如:整數除零等。

3、java.lang.NullPointerException

空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的

屬性、計算null對象的長度、使用throw語句拋出null等等

4、java.lang.ClassNotFoundException

找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH之后找不到對應名稱的class文件時,拋出

該異常。

對異常的處理:

try{}catch{}

try{}catch{}finally{}無論有無異常finally代碼塊都會被執行

try{}finally{}也是可以組合使用的但是catch{}finally{}不可以

注意:在繼承關系中,子類覆蓋父類的方法,拋出異常的范圍不能比父類更寬泛

異常的使用

在異常的使用這一部分主要是演示代碼,都是我們平常寫代碼的過程中會遇到的(當然只是一小部分),拋磚引玉嗎!

例1. 這個例子主要通過兩個方法對比來演示一下有了異常以后代碼的執行流程。

  1. public static void testException1() { 
  2.      int[] ints = new int[] { 1, 2, 3, 4 }; 
  3.      System.out.println("異常出現前"); 
  4.      try { 
  5.           System.out.println(ints[4]); 
  6.           System.out.println("我還有幸執行到嗎");// 發生異常以后,后面的代碼不能被執行 
  7.      } catch (IndexOutOfBoundsException e) { 
  8.           System.out.println("數組越界錯誤"); 
  9.      } 
  10.      System.out.println("異常出現后"); 
  11.  
  12. /*output
  13. 異常出現前 
  14. 數組越界錯誤 
  15. 常出現后 
  16. */ 
  17.  
  18. public static void testException2() { 
  19.      int[] ints = new int[] { 1, 2, 3, 4 }; 
  20.      System.out.println("異常出現前"); 
  21.      System.out.println(ints[4]); 
  22.      System.out.println("我還有幸執行到嗎");// 發生異常以后,他后面的代碼不能被執行 
  23.  

首先指出例子中的不足之處,IndexOutofBoundsException是一個非受檢異常,所以不用try…catch…顯示捕捉,但是我的目的是對同一個異常用不同的處理方式,看它會有什么不同的而結果(這里也就只能用它將就一下了)。異常出現時***個方法只是跳出了try塊,但是它后面的代碼會照樣執行的。但是第二種就不一樣了直接跳出了方法,比較強硬。從***個方法中我們看到,try…catch…是一種”事務性”的保障,它的目的是保證程序在異常的情況下運行完畢,同時它還會告知程序員程序中出錯的詳細信息(這種詳細信息有時要依賴于程序員設計)。

例2. 重新拋出異常

  1. public class Rethrow { 
  2.      public static void readFile(String file) throws FileNotFoundException { 
  3.      try { 
  4.           BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); 
  5.      } catch (FileNotFoundException e) { 
  6.           e.printStackTrace(); 
  7.           System.err.println("不知道如何處理該異常或者根本不想處理它,但是不做處理又不合適,這是重新拋出異常交給上一級處理"); 
  8.           //重新拋出異常 
  9.           throw e; 
  10.      } 
  11. public static void printFile(String file) { 
  12.      try { 
  13.           readFile(file); 
  14.      } catch (FileNotFoundException e) { 
  15.           e.printStackTrace(); 
  16.      } 
  17.      public static void main(String[] args) { 
  18.           printFile("D:/file"); 
  19.      } 
  20.  

異常的本意是好的,讓我們試圖修復程序,但是現實中我們修復的幾率很小,我們很多時候就是用它來記錄出錯的信息。如果你厭倦了不停的處理異常,重新拋出異常對你來說可能是一個很好的解脫。原封不動的把這個異常拋給上一級,拋給調用這個方法的人,讓他來費腦筋吧。這樣看來,java異常(當然指的是受檢異常)又給我們平添很多麻煩,盡管它的出發點是好的。

例3. 異常鏈的使用及異常丟失

  1. ExceptionA,ExceptionB,ExceptionC 
  2. public class ExceptionA extends Exception { 
  3.      public ExceptionA(String str) { 
  4.           super(); 
  5.      } 
  6. public class ExceptionB extends ExceptionA { 
  7.      public ExceptionB(String str) { 
  8.           super(str); 
  9.      } 
  10. public class ExceptionC extends ExceptionA { 
  11.      public ExceptionC(String str) { 
  12.           super(str); 
  13.      } 
  14.  

異常丟失的情況:

  1. public class NeverCaught { 
  2.      static void f() throws ExceptionB{ 
  3.           throw new ExceptionB("exception b"); 
  4.      } 
  5.      static void g() throws ExceptionC { 
  6.           try { 
  7.                f(); 
  8.           } catch (ExceptionB e) { 
  9.                ExceptionC c = new ExceptionC("exception a"); 
  10.                throw c; 
  11.           } 
  12.      } 
  13.      public static void main(String[] args) { 
  14.           try { 
  15.                g(); 
  16.           } catch (ExceptionC e) { 
  17.                e.printStackTrace(); 
  18.           } 
  19.      } 
  20. /* 
  21. exception.ExceptionC 
  22. at exception.NeverCaught.g(NeverCaught.java:12) 
  23. at exception.NeverCaught.main(NeverCaught.java:19) 
  24. */  

為什么只是打印出來了ExceptionC而沒有打印出ExceptionB呢?這個還是自己分析一下吧!

上面的情況相當于少了一種異常,這在我們排錯的過程中非常的不利。那我們遇到上面的情況應該怎么辦呢?這就是異常鏈的用武之地:保存異常信息,在拋出另外一個異常的同時不丟失原來的異常。

  1. public class NeverCaught { 
  2.      static void f() throws ExceptionB{ 
  3.            throw new ExceptionB("exception b"); 
  4.      } 
  5.      static void g() throws ExceptionC { 
  6.           try { 
  7.                 f(); 
  8.           } catch (ExceptionB e) { 
  9.                 ExceptionC c = new ExceptionC("exception a"); 
  10.                 //異常連 
  11.                 c.initCause(e); 
  12.                 throw c; 
  13.           } 
  14.      } 
  15.      public static void main(String[] args) { 
  16.           try { 
  17.                 g(); 
  18.           } catch (ExceptionC e) { 
  19.                 e.printStackTrace(); 
  20.           } 
  21.      } 
  22. /* 
  23. exception.ExceptionC 
  24. at exception.NeverCaught.g(NeverCaught.java:12) 
  25. at exception.NeverCaught.main(NeverCaught.java:21) 
  26. Caused by: exception.ExceptionB 
  27. at exception.NeverCaught.f(NeverCaught.java:5) 
  28. at exception.NeverCaught.g(NeverCaught.java:10) 
  29. ... 1 more 
  30. */  

這個異常鏈的特性是所有異常均具備的,因為這個initCause()方法是從Throwable繼承的。

例4. 清理工作

清理工作對于我們來說是必不可少的,因為如果一些消耗資源的操作,比如IO,JDBC。如果我們用完以后沒有及時正確的關閉,那后果會很嚴重,這意味著內存泄露。異常的出現要求我們必須設計一種機制不論什么情況下,資源都能及時正確的清理。這就是finally。

  1. public void readFile(String file) { 
  2.      BufferedReader reader = null
  3.      try { 
  4.            reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
  5.            // do some other work 
  6.      } catch (FileNotFoundException e) { 
  7.            e.printStackTrace(); 
  8.      } finally { 
  9.            try { 
  10.                  reader.close(); 
  11.            } catch (IOException e) { 
  12.                  e.printStackTrace(); 
  13.            } 
  14.      } 
  15.  

例子非常的簡單,是一個讀取文件的例子。這樣的例子在JDBC操作中也非常的常見。(所以,我覺得對于資源的及時正確清理是一個程序員的基本素質之一。)

Try…finally結構也是保證資源正確關閉的一個手段。如果你不清楚代碼執行過程中會發生什么異常情況會導致資源不能得到清理,那么你就用try對這段”可疑”代碼進行包裝,然后在finally中進行資源的清理。舉一個例子:

  1. public void readFile() { 
  2.      BufferedReader reader = null
  3.      try { 
  4.            reader = new BufferedReader(new InputStreamReader(new FileInputStream("file"))); 
  5.            // do some other work 
  6.            //close reader 
  7.            reader.close(); 
  8.      } catch (FileNotFoundException e) { 
  9.            e.printStackTrace(); 
  10.      } catch (IOException e) { 
  11.            e.printStackTrace(); 
  12.      } 
  13.  

我們注意一下這個方法和上一個方法的區別,下一個人可能習慣更好一點,及早的關閉reader。但是往往事與愿違,因為在reader.close()以前異常隨時可能發生,這樣的代碼結構不能預防任何異常的出現。因為程序會在異常出現的地方跳出,后面的代碼不能執行(這在上面應經用實例證明過)。這時我們就可以用try…finally來改造:

  1. public void readFile() { 
  2.      BufferedReader reader = null
  3.      try { 
  4.            try { 
  5.                  reader = new BufferedReader(new InputStreamReader(new FileInputStream("file"))); 
  6.                  // do some other work 
  7.                  // close reader 
  8.            } finally { 
  9.                  reader.close(); 
  10.            } 
  11.       } catch (FileNotFoundException e) { 
  12.            e.printStackTrace(); 
  13.       } catch (IOException e) { 
  14.            e.printStackTrace(); 
  15.       } 
  16.  

及早的關閉資源是一種良好的行為,因為時間越長你忘記關閉的可能性越大。這樣在配合上try…finally就保證萬無一失了(不要嫌麻煩,java就是這么中規中矩)。

再說一種情況,假如我想在構造方法中打開一個文件或者創建一個JDBC連接,因為我們要在其他的方法中使用這個資源,所以不能在構造方法中及早的將這個資源關閉。那我們是不是就沒轍了呢?答案是否定的。看一下下面的例子:

  1. public class ResourceInConstructor { 
  2.      BufferedReader reader = null
  3.      public ResourceInConstructor() { 
  4.           try { 
  5.                 reader = new BufferedReader(new InputStreamReader(new FileInputStream(""))); 
  6.           } catch (FileNotFoundException e) { 
  7.                 e.printStackTrace(); 
  8.           } 
  9.      } 
  10.      public void readFile() { 
  11.           try { 
  12.                  while(reader.readLine()!=null) { 
  13.                       //do some work 
  14.                  } 
  15.           } catch (IOException e) { 
  16.                  e.printStackTrace(); 
  17.           } 
  18.       } 
  19.       public void dispose() { 
  20.            try { 
  21.                 reader.close(); 
  22.            } catch (IOException e) { 
  23.                 e.printStackTrace(); 
  24.            } 
  25.       } 
  26.  

這一部分講的多了一點,但是異常確實是看起來容易用起來難的東西呀,java中還是有好多的東西需要深挖的。

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2024-01-04 07:42:44

JavaCGLIBJDK

2024-01-24 08:31:13

extends?接口規范

2025-01-10 09:28:25

2023-10-23 12:35:36

Golang追加操作

2021-03-02 09:12:25

Java異常機制

2024-12-26 01:07:13

2009-12-23 16:13:00

WPF Attache

2009-12-14 13:33:49

Ruby與Python

2011-02-25 09:23:00

Java類加載器

2015-09-02 08:57:56

JavaHashMap工作原理

2024-09-24 17:34:05

2024-01-25 11:42:00

C++編程指針常量

2025-02-10 09:49:00

2010-03-31 14:58:03

云計算

2009-12-07 16:07:03

PHP類的繼承

2010-07-21 09:38:15

PHP緩存技術

2010-11-22 14:18:32

MySQL鎖機制

2021-05-17 05:36:02

CSS 文字動畫技巧

2009-11-20 17:17:08

Oracle函數索引

2009-06-16 10:51:14

Java源碼
點贊
收藏

51CTO技術棧公眾號

白白在线精品| 中文无码日韩欧| 91在线视频网址| 欧美亚洲激情在线| 污污片在线免费视频| 亚洲天堂中文字幕| 国产爆乳无码一区二区麻豆| 欧美色图国产精品| 精品国产一区二区三区久久久| 日本中文字幕在线2020| 亚洲免费在线看| 妞干网在线观看视频| 亚洲欧美久久久| 国产成人精品久久二区二区| 欧美成人一二区| 亚洲精品一区二区精华| 在线视频国产三级| 亚洲国产精品精华液ab| 日韩精品福利片午夜免费观看| 在线播放日韩| 91精品视频网站| 日韩av三区| 欧美激情欧美激情| www久久久| www国产91| 欧美电影免费观看高清完整| 日韩女优电影在线观看| 国产在线91| 欧美视频在线观看 亚洲欧| 又黄又爽毛片免费观看| 久久嫩草精品久久久久| 欧美日韩dvd| 日本女人一区二区三区| 久久99精品久久久久久三级| 一本一道久久a久久精品蜜桃| 欧洲成人在线视频| 草草视频在线一区二区| 九九精品视频在线| 99re8精品视频在线观看| 中文日韩在线视频| 亚洲三级欧美| 亚洲丝袜一区在线| 亚洲精品.com| 日韩性生活视频| 成人污版视频| 久久青草福利网站| 无码少妇一区二区三区| 国产精欧美一区二区三区| 欧美日韩一区二区三区四区不卡| 久久久免费高清电视剧观看| 国产精品宾馆| 欧美一区视频在线| 小嫩嫩12欧美| 国产中文欧美精品| 欧美日本一区二区高清播放视频| 97免费高清电视剧观看| 亚洲人成免费| 色涩成人影视在线播放| 狠狠色狠狠色合久久伊人| 亚洲精品久久久久久久蜜桃臀| 91视频精品在这里| 成人免费网站视频www| 亚洲444eee在线观看| a天堂中文在线88| 大伊香蕉精品在线品播放| 在线播放国产一区二区三区| 三区在线视频| 中文字幕精品综合| 国产美女网站在线观看| 免费电影视频在线看| 久久精品五月婷婷| 国产高清一区| 国产精品theporn88| 一本色道88久久加勒比精品| 久久资源亚洲| 国产不卡一区视频| 成人软件网18免费视频| 91国偷自产一区二区开放时间| av资源一区| 久久久免费电影| 欧美一区国产在线| 777久久精品一区二区三区无码| 欧美久久电影| 亚洲少妇一区| 人人干视频在线| 亚洲国产视频一区| 国产精品论坛| 91精品国产高清自在线| 国产伊人精品| 日韩小视频在线播放| 亚洲国产wwwccc36天堂| 欧美黑人猛交的在线视频| 欧美激情一区二区三区高清视频 | 亚洲午夜小视频| 日韩av黄色在线| 日韩av一级大片| 欧美国产精品v| av男人的天堂在线| 欧美国产精品人人做人人爱| 亚洲国产裸拍裸体视频在线观看乱了中文 | 一区二区国产盗摄色噜噜| 182tv在线播放| 国产91精品久久久久久| 日韩和的一区二区| av毛片免费看| 亚洲第一色中文字幕| 任你躁在线精品免费| 亚洲图片小说在线| 亚洲午夜av在线| 成人福利一区二区| 久久av一区二区三区亚洲| 中文字幕一区二区三区不卡| 国产在线美女| 91在线观看免费观看| 国产视频一区二区三区在线观看| 黄色网址在线免费| 国产精品成人品| 久久综合久久99| 7777kkk亚洲综合欧美网站| 亚洲a级在线播放观看| 日韩一区二区三区在线免费观看 | 91成人看片片| 欧美羞羞视频| 国产日韩欧美日韩大片| 国产精品a级| 欧美视频第三页| 欧美一区二区免费视频| 欧美激情电影| 欧美专区一二三| 亚洲精选一二三| 99九九久久| 成人精品一区二区三区电影免费| а√天堂资源国产精品| 人人妻人人添人人爽欧美一区| 国产a视频精品免费观看| 一级二级三级在线观看| 久久久国产91| 日韩国产欧美三级| 免费在线一级视频| 欧美亚洲国产视频小说| 91色婷婷久久久久合中文| 韩国日本一区| 国产99在线播放| 亚洲国产综合视频在线观看| 国产精品18| 欧美久久在线观看| 日韩激情片免费| 日韩av在线免费观看不卡| 91在线播放网站| 成人在线免费观看一区| 精品色蜜蜜精品视频在线观看| 午夜欧洲一区| 天堂色在线视频| 91成人性视频| 自拍偷拍欧美激情| 果冻天美麻豆一区二区国产| 男人日女人bb视频| 亚洲全黄一级网站| 国产福利电影一区二区三区| xx欧美视频| 日本手机在线视频| 日韩亚洲精品视频| 久久综合999| www.豆豆成人网.com| 69久久久久久| 81精品国产乱码久久久久久| 国产精品久久久久久久久快鸭| 日韩一二三区| 2022亚洲天堂| 欧美国产第一页| 欧美国产精品劲爆| 欧美人与拘性视交免费看| gogo人体高清视频| 国产精品久久中文| 午夜电影一区二区| 欧美 日韩 国产 一区| 成人动漫在线免费观看| 九9re精品视频在线观看re6| 日韩视频免费观看高清在线视频| 肉丝袜脚交视频一区二区| 亚洲天堂av影院| 成人在线激情网| 欧美中文字幕在线视频| 亚洲一区视频在线| 亚洲一级一区| 一区二区电影免费观看| 丁香啪啪综合成人亚洲| 国产精品户外野外| 香蕉久久一区二区不卡无毒影院 | www欧美日韩| 91天堂在线视频| 日本xxxxxxx免费视频| 青草久久伊人| 一区二区三区四区高清视频 | 亚洲天堂二区| 国产精品久久..4399| 亚洲精品国产精品国自产| 在线精品91av| 欧美成人免费小视频| 日韩欧美一级特黄在线播放|