亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

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

2019-11-26 15:57:56
字體:
來源:轉載
供稿:網友
異常與錯誤:
  異常:
  在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. 這個例子主要通過兩個方法對比來演示一下有了異常以后代碼的執行流程。
復制代碼 代碼如下:

public static void testException1() {
int[] ints = new int[] { 1, 2, 3, 4 };
System.out.println("異常出現前");
try {
System.out.println(ints[4]);
System.out.println("我還有幸執行到嗎");// 發生異常以后,后面的代碼不能被執行
} catch (IndexOutOfBoundsException e) {
System.out.println("數組越界錯誤");
}
System.out.println("異常出現后");
}

/*output:
  異常出現前
  數組越界錯誤
  常出現后
  */
復制代碼 代碼如下:

public static void testException2() {
int[] ints = new int[] { 1, 2, 3, 4 };
System.out.println("異常出現前");
System.out.println(ints[4]);
System.out.println("我還有幸執行到嗎");// 發生異常以后,他后面的代碼不能被執行
}

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

public class Rethrow {
public static void readFile(String file) throws FileNotFoundException {
try {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
System.err.println("不知道如何處理該異常或者根本不想處理它,但是不做處理又不合適,這是重新拋出異常交給上一級處理");
//重新拋出異常
throw e;
}
}
public static void printFile(String file) {
try {
readFile(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
printFile("D:/file");
}
}

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

ExceptionA,ExceptionB,ExceptionC
public class ExceptionA extends Exception {
public ExceptionA(String str) {
super();
}
}
public class ExceptionB extends ExceptionA {
public ExceptionB(String str) {
super(str);
}
}
public class ExceptionC extends ExceptionA {
public ExceptionC(String str) {
super(str);
}
}

  異常丟失的情況:
復制代碼 代碼如下:

public class NeverCaught {
static void f() throws ExceptionB{
throw new ExceptionB("exception b");
}
static void g() throws ExceptionC {
try {
f();
} catch (ExceptionB e) {
ExceptionC c = new ExceptionC("exception a");
throw c;
}
}
public static void main(String[] args) {
try {
g();
} catch (ExceptionC e) {
e.printStackTrace();
}
}
}
/*
exception.ExceptionC
at exception.NeverCaught.g(NeverCaught.java:12)
at exception.NeverCaught.main(NeverCaught.java:19)
*/

為什么只是打印出來了ExceptionC而沒有打印出ExceptionB呢?這個還是自己分析一下吧!
  上面的情況相當于少了一種異常,這在我們排錯的過程中非常的不利。那我們遇到上面的情況應該怎么辦呢?這就是異常鏈的用武之地:保存異常信息,在拋出另外一個異常的同時不丟失原來的異常。
復制代碼 代碼如下:

public class NeverCaught {
static void f() throws ExceptionB{
throw new ExceptionB("exception b");
}
static void g() throws ExceptionC {
try {
f();
} catch (ExceptionB e) {
ExceptionC c = new ExceptionC("exception a");
//異常連
c.initCause(e);
throw c;
}
}
public static void main(String[] args) {
try {
g();
} catch (ExceptionC e) {
e.printStackTrace();
}
}
}
/*
exception.ExceptionC
at exception.NeverCaught.g(NeverCaught.java:12)
at exception.NeverCaught.main(NeverCaught.java:21)
Caused by: exception.ExceptionB
at exception.NeverCaught.f(NeverCaught.java:5)
at exception.NeverCaught.g(NeverCaught.java:10)
... 1 more
*/

  這個異常鏈的特性是所有異常均具備的,因為這個initCause()方法是從Throwable繼承的。
  例4. 清理工作
  清理工作對于我們來說是必不可少的,因為如果一些消耗資源的操作,比如IO,JDBC。如果我們用完以后沒有及時正確的關閉,那后果會很嚴重,這意味著內存泄露。異常的出現要求我們必須設計一種機制不論什么情況下,資源都能及時正確的清理。這就是finally。
復制代碼 代碼如下:

public void readFile(String file) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
// do some other work
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

例子非常的簡單,是一個讀取文件的例子。這樣的例子在JDBC操作中也非常的常見。(所以,我覺得對于資源的及時正確清理是一個程序員的基本素質之一。)
  Try...finally結構也是保證資源正確關閉的一個手段。如果你不清楚代碼執行過程中會發生什么異常情況會導致資源不能得到清理,那么你就用try對這段"可疑"代碼進行包裝,然后在finally中進行資源的清理。舉一個例子:
復制代碼 代碼如下:

public void readFile() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream("file")));
// do some other work
//close reader
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

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

public void readFile() {
BufferedReader reader = null;
try {
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream("file")));
// do some other work
// close reader
} finally {
reader.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

及早的關閉資源是一種良好的行為,因為時間越長你忘記關閉的可能性越大。這樣在配合上try...finally就保證萬無一失了(不要嫌麻煩,java就是這么中規中矩)。
  再說一種情況,假如我想在構造方法中打開一個文件或者創建一個JDBC連接,因為我們要在其他的方法中使用這個資源,所以不能在構造方法中及早的將這個資源關閉。那我們是不是就沒轍了呢?答案是否定的??匆幌孪旅娴睦樱?BR>
復制代碼 代碼如下:

public class ResourceInConstructor {
BufferedReader reader = null;
public ResourceInConstructor() {
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void readFile() {
try {
while(reader.readLine()!=null) {
//do some work
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void dispose() {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

  這一部分講的多了一點,但是異常確實是看起來容易用起來難的東西呀,java中還是有好多的東西需要深挖的
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国自产精品中文字幕亚洲| 懂色av影视一区二区三区| 88国产精品欧美一区二区三区| 久久艹在线视频| 国产日韩欧美电影在线观看| 久久噜噜噜精品国产亚洲综合| 国产主播喷水一区二区| 91亚洲精品视频| 日韩av色综合| 欧美韩日一区二区| 欧美在线观看网址综合| 97视频免费看| 日韩亚洲综合在线| 日本高清不卡的在线| 精品亚洲一区二区三区四区五区| 国产精品日韩av| 91免费综合在线| 中文字幕日韩免费视频| 97激碰免费视频| 欧美在线视频一区二区| 精品女同一区二区三区在线播放| 亚洲美女av在线播放| 国产亚洲精品久久久久动| 午夜精品久久久久久久99热浪潮| 国语自产精品视频在线看| 欧美重口另类videos人妖| 国产精品久久久久久久app| 草民午夜欧美限制a级福利片| 欧美激情在线视频二区| 日韩在线免费观看视频| 亚洲国产精彩中文乱码av| 欧美超级乱淫片喷水| 尤物yw午夜国产精品视频明星| 欧美放荡办公室videos4k| 国产91精品高潮白浆喷水| 欧美电影免费播放| 亚洲电影免费观看高清完整版在线观看| zzijzzij亚洲日本成熟少妇| 国产日韩欧美影视| 96sao精品视频在线观看| 91精品国产沙发| 亚洲精品日韩久久久| 亚洲专区国产精品| 日韩影视在线观看| 日韩在线视频导航| 欧洲日韩成人av| 国内精品模特av私拍在线观看| 91精品国产91久久久久久不卡| 亚洲精品在线观看www| 97精品国产97久久久久久春色| 亚洲3p在线观看| 国产精品久久久久久久久久久新郎| 国产精品黄色影片导航在线观看| 久久99久久99精品中文字幕| 2019中文字幕全在线观看| 欧美激情一级精品国产| 欧美日韩一区二区免费在线观看| 国产亚洲综合久久| 亚洲国产精品免费| 欧美在线视频在线播放完整版免费观看| 亚洲视频在线免费观看| 38少妇精品导航| 成人妇女淫片aaaa视频| 日韩中文字幕精品| 成人有码在线视频| 美女av一区二区| 亚洲成人免费在线视频| 日韩精品久久久久久福利| 欧美在线性爱视频| 国产成人福利网站| 久久久久久国产精品美女| 日韩欧美在线国产| 欧美性理论片在线观看片免费| 亚洲伊人一本大道中文字幕| 欧美最顶级的aⅴ艳星| 成人午夜高潮视频| 日本成人黄色片| 18性欧美xxxⅹ性满足| 日韩电视剧免费观看网站| 国产精品视频一区国模私拍| 亚洲人成网站777色婷婷| 78色国产精品| 8x拔播拔播x8国产精品| 久久精品国产精品亚洲| 亚洲区在线播放| 欧美亚洲视频一区二区| 久久亚洲综合国产精品99麻豆精品福利| 欧美精品在线视频观看| 精品久久中文字幕久久av| 国产亚洲欧美一区| 国产精品吹潮在线观看| 久久久亚洲国产| 欧美电影免费观看网站| 亚洲高清色综合| 亚洲已满18点击进入在线看片| 亚洲丝袜一区在线| 亚洲精品国精品久久99热| 97激碰免费视频| www.亚洲免费视频| 国产精品久久久久77777| 亚洲黄色www| 九九久久国产精品| 国产欧美一区二区三区在线看| 538国产精品视频一区二区| 成人妇女免费播放久久久| 亚洲国产黄色片| 亚洲国产日韩欧美综合久久| 国产成人啪精品视频免费网| 国产91免费看片| 伊人久久久久久久久久久久久| 欧美精品18videos性欧美| 成人黄色在线免费| 欧美孕妇与黑人孕交| 国产伦精品免费视频| 成人深夜直播免费观看| 91在线无精精品一区二区| 91久久久精品| 成人黄色免费看| 91视频-88av| 97免费中文视频在线观看| 欧美日本黄视频| 日韩电影免费观看在线| 91精品国产高清| 久久精品视频99| 日韩成人av网址| 91色p视频在线| 91成人免费观看网站| 91av视频在线播放| 98午夜经典影视| 91超碰中文字幕久久精品| 国产精品极品美女粉嫩高清在线| 国产精品久久久久高潮| 91国产视频在线| 亚洲天堂免费视频| 国产精品无码专区在线观看| 欧美视频在线观看免费网址| 亚洲一区999| 国产精品白嫩初高中害羞小美女| 国产成人综合精品在线| 麻豆精品精华液| 亚洲第一偷拍网| 欧美综合国产精品久久丁香| 日韩最新中文字幕电影免费看| 久久免费视频在线观看| 久久99视频免费| 欧美精品做受xxx性少妇| 欧美极品美女视频网站在线观看免费| 亚洲精品美女在线观看| 久热精品视频在线观看一区| 最近中文字幕mv在线一区二区三区四区| 欧美激情性做爰免费视频| 久久免费精品日本久久中文字幕| 精品日韩美女的视频高清| 亚洲一区二区三区乱码aⅴ| 亚洲第一视频网| 亚洲国产高潮在线观看| 国产精品美女久久久久av超清| 久久久久国产精品www| 中文字幕精品久久| 日本精品一区二区三区在线播放视频| 亚洲精品第一国产综合精品| 日韩av免费网站| 在线看福利67194| 插插插亚洲综合网|