亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Java中Exception和Error有什么區別?

Java中Exception和Error有什么區別?

來源:千鋒教育
發布人:qyf
時間: 2022-06-07 14:30:00 1654583400

  來我們好好講講異常,畢竟我們就是改了寫,寫了改,開講:

  在 Java 中的基本理念是 結構不佳的代碼不能運行,發現錯誤的理想時期是在編譯期間,因為你不用運行程序,只是憑借著對 Java 基本理念的理解就能發現問題。但是編譯期并不能找出所有的問題,有一些 NullPointerException 和 ClassNotFoundException 在編譯期找不到,這些異常是 RuntimeException 運行時異常,這些異常往往在運行時才能被發現。

  我們寫 Java 程序經常會出現兩種問題,一種是 java.lang.Exception ,一種是 java.lang.Error,都用來表示出現了異常情況,下面就針對這兩種概念進行理解。

  認識 Exception :

  Exception 位于 java.lang 包下,它是一種頂級接口,繼承于 Throwable 類,Exception 類及其子類都是 Throwable 的組成條件,是程序出現的合理情況。

  在認識 Exception 之前,有必要先了解一下什么是 Throwable。

  什么是 Throwable?

  Throwable 類是 Java 語言中所有錯誤(errors)和異常(exceptions)的父類。只有繼承于 Throwable 的類或者其子類才能夠被拋出,還有一種方式是帶有 Java 中的 @throw 注解的類也可以拋出。

  在Java規范中,對非受查異常和受查異常的定義是這樣的:

  The unchecked exception classes are the run-time exception classes and the error classes.

  The checked exception classes are all exception classes other than the unchecked exception classes. That is, the checked exception classes are Throwable and all its subclasses other than RuntimeException and its subclasses and Errorand its subclasses.

  也就是說,除了 RuntimeException 和其子類,以及error和其子類,其它的所有異常都是 checkedException。

  那么,按照這種邏輯關系,我們可以對 Throwable 及其子類進行歸類分析:

圖片1

  可以看到,Throwable 位于異常和錯誤的最頂層,我們查看 Throwable 類中發現它的方法和屬性有很多,我們只討論其中幾個比較常用的:

// 返回拋出異常的詳細信息public string getMessage();public string getLocalizedMessage();

//返回異常發生時的簡要描述public public String toString();

  // 打印異常信息到標準輸出流上public void printStackTrace();public void printStackTrace(PrintStream s);public void printStackTrace(PrintWriter s)

// 記錄棧幀的的當前狀態public synchronized Throwable fillInStackTrace();

此外,因為 Throwable 的父類也是 Object,所以常用的方法還有繼承其父類的getClass() 和 getName() 方法。

 

  常見的 Exception

  下面我們回到 Exception 的探討上來,現在你知道了 Exception 的父類是 Throwable,并且 Exception 有兩種異常,一種是 RuntimeException ;一種是 CheckedException,這兩種異常都應該去捕獲。

  下面列出了一些 Java 中常見的異常及其分類,這塊面試官也可能讓你舉出幾個常見的異常情況并將其分類

  RuntimeException

00

  UncheckedException

01

  與 Exception 有關的 Java 關鍵字

  那么 Java 中是如何處理這些異常的呢?在 Java 中有這幾個關鍵字 throws、throw、try、finally、catch 下面我們分別來探討一下

  throws 和 throw

  在 Java 中,異常也就是一個對象,它能夠被程序員自定義拋出或者應用程序拋出,必須借助于 throws 和 throw 語句來定義拋出異常。

  throws 和 throw 通常是成對出現的,例如

static void cacheException() throws Exception{
throw new Exception();
}

  throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。

  throws 語句用在方法聲明后面,表示再拋出異常,由該方法的調用者來處理。

  throws 主要是聲明這個方法會拋出這種類型的異常,使它的調用者知道要捕獲這個異常。

  throw 是具體向外拋異常的動作,所以它是拋出一個異常實例。

  try 、finally 、catch

  這三個關鍵字主要有下面幾種組合方式 try...catch 、try...finally、try...catch...finally。

  try...catch 表示對某一段代碼可能拋出異常進行的捕獲,如下:

static void cacheException() throws Exception{
try {
System.out.println("1");
}catch (Exception e){
e.printStackTrace();
}
}
try...finally 表示對一段代碼不管執行情況如何,都會走 finally 中的代碼
static void cacheException() throws Exception{
for (int i = 0; i < 5; i++) {
System.out.println("enter: i=" + i);
try {
System.out.println("execute: i=" + i);
continue;
} finally {
System.out.println("leave: i=" + i);
}
}
}
try...catch...finally 也是一樣的,表示對異常捕獲后,再走 finally 中的代碼邏輯。

  JDK1.7 使用 try...with...resources 優雅關閉資源

  Java 類庫中有許多資源需要通過 close 方法進行關閉。比如 InputStream、OutputStream,數據庫連接對象 Connection,MyBatis 中的 SqlSession 會話等。作為開發人員經常會忽略掉資源的關閉方法,導致內存泄漏。

  根據經驗,try-finally語句是確保資源會被關閉的最佳方法,就算異常或者返回也一樣。try-catch-finally 一般是這樣來用的

static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
}finally {
br.close();
}
}

  這樣看起來代碼還是比較整潔,但是當我們添加第二個需要關閉的資源的時候,就像下面這樣:

static void copy(String src,String dst) throws Exception{
InputStream is = new FileInputStream(src);
try {

OutputStream os = new FileOutputStream(dst);
try {
byte[] buf = new byte[100];
int n;
while ((n = is.read()) >= 0){
os.write(buf,n,0);
}
}finally {
os.close();
}
}finally {
is.close();
}
}

  這樣感覺這個方法已經變得臃腫起來了。

  而且這種寫法也存在諸多問題,即使 try - finally 能夠正確關閉資源,但是它不能阻止異常的拋出,因為 try 和 finally 塊中都可能有異常的發生。

  比如說你正在讀取的時候硬盤損壞,這個時候你就無法讀取文件和關閉資源了,此時會拋出兩個異常。但是在這種情況下,第二個異常會抹掉第一個異常。在異常堆棧中也無法找到第一個異常的記錄,怎么辦,難道像這樣來捕捉異常么?

static void tryThrowException(String path) throws Exception {

BufferedReader br = new BufferedReader(new FileReader(path));
try {
String s = br.readLine();
System.out.println("s = " + s);

}catch (Exception e){
e.printStackTrace();
}finally {
try {
br.close();
}catch (Exception e){
e.printStackTrace();
}finally {
br.close();
}
}
}

  這種寫法,雖然能解決異常拋出的問題,但是各種 try-cath-finally 的嵌套會讓代碼變得非常臃腫。

  Java7 中引入了try-with-resources 語句時,所有這些問題都能得到解決。要使用 try-with-resources 語句,首先要實現 AutoCloseable 接口,此接口包含了單個返回的 close 方法。Java 類庫與三方類庫中的許多類和接口,現在都實現或者擴展了 AutoCloseable 接口。如果編寫了一個類,它代表的是必須關閉的資源,那么這個類應該實現 AutoCloseable 接口。

  java 引入了 try-with-resources 聲明,將 try-catch-finally 簡化為 try-catch,這其實是一種語法糖,在編譯時會進行轉化為 try-catch-finally 語句。

  下面是使用 try-with-resources 的第一個范例:

/**
* 使用try-with-resources 改寫示例一
* @param path
* @return
* @throws IOException
*/static String firstLineOfFileAutoClose(String path) throws IOException {

try(BufferedReader br = new BufferedReader(new FileReader(path))){
return br.readLine();
}
}
使用 try-with-resources 改寫程序的第二個示例
static void copyAutoClose(String src,String dst) throws IOException{

try(InputStream in = new FileInputStream(src);
OutputStream os = new FileOutputStream(dst)){
byte[] buf = new byte[1000];
int n;
while ((n = in.read(buf)) >= 0){
os.write(buf,0,n);
}
}
}

  使用 try-with-resources 不僅使代碼變得通俗易懂,也更容易診斷。以firstLineOfFileAutoClose方法為例,如果調用 readLine()和 close() 方法都拋出異常,后一個異常就會被禁止,以保留第一個異常。

  異常處理的原則,我們在日常處理異常的代碼中,應該遵循三個原則:

  不要捕獲類似 Exception 之類的異常,而應該捕獲類似特定的異常,比如 InterruptedException,方便排查問題,而且也能夠讓其他人接手你的代碼時,會減少罵你的次數。

  不要生吞異常。這是異常處理中要特別注重的事情,因為很可能會非常難以正常結束情況,如果我們不把異常拋出去,或者也沒有輸出到Logger日志中,程序可能會在后面以不可控的方式結束

  不要在函數式編程中使用 checkedException。

  什么是 Error?

  Error 是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。這些錯誤是不可檢查的,因為它們在應用程序的控制和處理能力之 外,而且絕大多數是程序運行時不允許出現的狀況,比如 OutOfMemoryError 和 StackOverflowError異常的出現會有幾種情況,這里需要先介紹一下 Java 內存模型 JDK1.7。

圖片2

  其中包括兩部分,由所有線程共享的數據區和線程隔離的數據區組成,在上面的 Java 內存模型中,只有程序計數器是不會發生 OutOfMemoryError 情況的區域,程序計數器控制著計算機指令的分支、循環、跳轉、異常處理和線程恢復,并且程序計數器是每個線程私有的。

  什么是線程私有:表示的就是各條線程之間互不影響,獨立存儲的內存區域。

  如果應用程序執行的是 Java 方法,那么這個計數器記錄的就是虛擬機字節碼指令的地址;如果正在執行的是 Native 方法,這個計數器值則為空(Undefined)。除了程序計數器外,其他區域:方法區(Method Area)、虛擬機棧(VM Stack)、本地方法棧(Native Method Stack) 和 堆(Heap) 都是可能發生 OutOfMemoryError 的區域。

  虛擬機棧:如果線程請求的棧深度大于虛擬機棧所允許的深度,將會出現 StackOverflowError 異常;如果虛擬機動態擴展無法申請到足夠的內存,將出現 OutOfMemoryError。本地方法棧和虛擬機棧一樣,堆:Java 堆可以處于物理上不連續,邏輯上連續,就像我們的磁盤空間一樣,如果堆中沒有內存完成實例分配,并且堆無法擴展時,將會拋出 OutOfMemoryError。方法區:方法區無法滿足內存分配需求時,將拋出 OutOfMemoryError 異常。

  一道非常經典的面試題:NoClassDefFoundError 和 ClassNotFoundException 有什么區別?

  在類的加載過程中, JVM 或者 ClassLoader 無法找到對應的類時,都可能會引起這兩種異常/錯誤,由于不同的 ClassLoader 會從不同的地方加載類,有時是錯誤的 CLASSPATH 類路徑導致的這類錯誤,有時是某個庫的 jar 包缺失引發這類錯誤。NoClassDefFoundError 表示這個類在編譯時期存在,但是在運行時卻找不到此類,有時靜態初始化塊也會導致 NoClassDefFoundError 錯誤。

  ClassLoader 是類路徑裝載器,在Java 中,類路徑裝載器一共有三種兩類

  一種是虛擬機自帶的 ClassLoader,分為三種

  啟動類加載器(Bootstrap) ,負責加載 $JAVAHOME/jre/lib/rt.jar

  擴展類加載器(Extension),負責加載 $JAVAHOME/jre/lib/ext/*.jar

  應用程序類加載器(AppClassLoader),加載當前應用的 classpath 的所有類

  第二種是用戶自定義類加載器

  Java.lang.ClassLoader 的子類,用戶可以定制類的加載方式。

圖片3

  另一方面,ClassNotFoundException 與編譯時期無關,當你嘗試在運行時使用反射加載類時,ClassNotFoundException 就會出現。

  簡而言之,ClassNotFoundException 和 NoClassDefFoundError 都是由 CLASSPATH 中缺少類引起的,通常是由于缺少 JAR 文件而引起的,但是如果 JVM 認為應用運行時找不到相應的引用,就會拋出 NoClassDefFoundError 錯誤;當你在代碼中顯示的加載類比如 Class.forName() 調用時卻沒有找到相應的類,就會拋出 java.lang.ClassNotFoundException。

  NoClassDefFoundError 是 JVM 引起的錯誤,是 unchecked,未經檢查的。因此不會使用 try-catch 或者 finally 語句塊;另外,ClassNotFoundException 是受檢異常,因此需要 try-catch 語句塊或者 try-finally 語句塊包圍,否則會導致編譯錯誤。

  調用 Class.forName()、ClassLoader.findClass() 和 ClassLoader.loadClass() 等方法時可能會引起 java.lang.ClassNotFoundException

  NoClassDefFoundError 是鏈接錯誤,發生在鏈接階段,當解析引用找不到對應的類,就會觸發;而 ClassNotFoundException 是發生在運行時的異常。

  更多關于“java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業需求,更科學更嚴謹,每年培養泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
AAA女人18毛片水真多| 亚洲精品永久在线观看| 亚洲高清国产AV拍精品青青草原 | 敌伦交换第21部分剧情介绍 | 初尝黑人嗷嗷叫中文字幕| 国产精品无码永久免费888| 久99久无码精品视频免费播放| 蜜臀AV午夜一区二区三区| 日韩人妻无码免费视频一区二区三区 | 久久99精品免费一区二区| 女被啪到高潮的GIF动态图无遮| 日韩精品无码人妻免费视频| 亚洲AV成人网站在线观看| 中文无码熟妇人妻AV在线| 丰满人妻一区二区三区免费视频| 狠狠躁夜夜躁人爽碰88A| 你真紧你这是要我的命吗什么意思| 色欧美与xxxxx| 亚洲精品国产A久久久久久| 中字无码AV电影在线观看网站| 粉嫩少妇内射浓精VIDEOS| 精品高潮呻吟99AV无码| 欧美伊人久久大香线蕉综合| 午在线亚洲男人午在线| 中文无码一区二区不卡ΑV| 国产99久久亚洲综合精品| 久久精品成人无码观看不卡| 日本边添边摸边做边爱小视频| 亚洲AV日韩AV无码| 51CG吃瓜网热心朝阳群众| 国产乱妇乱子在线播放视频| 免费无码AV片在线观看| 无码AV高潮喷水无码专区线| 中文字幕理伦午夜福利片| 国产成人精品无码一区二区三区| 久久九九久精品国产| 少妇高潮惨叫喷水在线观看| 亚洲午夜性春猛交XXXX亚训| 大号BBVVBBW高潮| 久久人人97超碰精品| 私人IMAX情侣影院家庭影院| 在线A级毛片免费视频| 国产精品嫩草影院永久…| 女子初尝黑人巨嗷嗷叫| 亚洲AV无码潮喷在线观看蜜桃| AV无码免费一区二区三区| 好紧好骚好诱人好软| 人体艺术大胆图片| 亚洲中文字幕无码久久2020| 国产超碰人人模人人爽人人添| 美女大BXXXXN内射| 亚洲AV日韩AV高潮喷潮无码天| WWW射我里面在线观看| 久久大香伊蕉在人线免费AV| 熟悉妇人妻av无码毛片| 92国产精品午夜福利免费| 河南少妇凸BBWBBW| 日韩一区二区三区射精| 制服丝袜另类专区制服| 国产一区二区女内射| 日本少妇高潮喷水XXXXXXX| 一本大道色婷婷在线| 国产日产欧产精品精品推荐| 秋霞鲁丝片成人无码| 医院人妻闷声隔着帘子被中出| 国产九九99久久99大香伊| 日本丶国产丶欧美色综合| 再深点灬舒服灬太大了添A| 国内盗摄视频一区二区三区| 色噜噜狠狠色综合日日 | 亚洲精品在看在线观看| 国产馆AV超薄肉色丝袜| 人妻少妇伦在线麻豆M电影| 尤物精品国产第一福利网站| 国产亚洲AV综合人人澡精品| 色妞WW精品视频7777| CAOPORN超碰进入页面| 久久婷婷五月综合国产| 亚洲AV永久无码精品无码自慰| 高潮和狂野射精合集| 秋霞电影网免费观看| 337P日本欧洲亚洲大胆| 久久精品无码专区免费| 亚洲AV无码一区二区乱子伦AS| 国产 精品 自在自线| 人妻无码一区二区三区视频 | 一本久久知道综合久久| 狠狠CAO2020高清视频| 无码人妻丰满熟妇区免费| 成 人 免 费 黄 色 网站无| 欧美成人家庭影院| 中文字幕人乱码中文字幕| 久久99精品国产99久久6男男| 亚洲AV成人精品五区| 国产成人亚洲精品另类动态| 人妻体内射精一区二区三四| 97久久超碰国产精品2021| 开心亚洲五月丁香五月| 亚洲熟妇无码久久精品疯| 狠狠躁夜夜躁人人爽天天BL| 香蕉国产成版人视频APP| 国产精品盗摄!偷窥盗摄| 少妇婬荡久久久久AV无码| 成人糖心VLOG视频| 人妻少妇精品中文字幕AV| AV永久免费网站入口| 逆徒每天都想着欺师犯上 | 亚洲精品无码AV中文字幕| 国产午夜三级一区二区三 | 熟睡被义子侵犯中文字幕| 丰满多毛的大隂户BEST| 日韩一区二区在线观看视频| 菠萝蜜国际通道一区麻豆| 人人做人碰人人添| 夜夜高潮夜夜爽夜夜爱爱一区| 老干部熟女高潮视频| 最新中文AV岛国无码免费播放| 精品日本一区二区三区免费| 亚洲成AV人片在线观看无码| 国模生殖欣赏337METCN| 亚洲AV色无码乱码在线观看| 国产日产欧产精品精品推荐| 香蕉久久AV一区二区三区APP| 国产精品原创巨作AV女教师| 午夜免费无码福利视频网址| 国产久9视频这里只有精品| 午夜视频体内射.COM.COM| 国产欧美日韩专区发布| 性少妇FREESEXVIDEO| 狠狠人妻熟妇av又粗又大| 亚洲另类春色国产精品| 九九电影网午夜理论片| 亚洲中国最大AV网站| 老师你的兔子好软水好多的图片| 中国东北熟女老太婆内谢| 男人女人做爽爽18禁免费| AV无码国产在线看免费网站| 欧美群交XXXCOM| 差差漫画页面在线阅读弹窗在线看 | 朋友的人妻的滋味BD高清中文| 把腿张开我要CAO死你在线观看| 琪琪电影网WWW888DVDC| 大学生高潮无套内谢视频| 无码动漫性爽XO视频在线观看不 | 久久自己只精产国品| 50岁退休熟女露脸高潮| 国产精品天干天干综合网| 日本MACBOOKPRO高清| 中文无码一区二区三区在线观看| 男人扒开女人下部添高潮的视频 | 亚洲人色婷婷成人网站在线观看| 久久夜色撩人精品国产小说| 97久久久精品综合88久久| 日本乱偷人妻中文字幕久久| 丰满少妇BBWBBW| 亚洲AV无码之日韩精品| 久久免费的精品国产V∧| 97精品一区二区视频在线观看| 日产乱码一二三区别免费麻豆| 国产激情无码一区二区APP| 亚洲国产一区二区A毛片| 免费国精产品一品二品| 成人免费A级毛片无码片2022| 无码人妻丰满熟妇区BBBBXXXX| 精品国产乱码一区二区三区APP| 中文区中文字幕免费看| 日本熟妇色XXXXX日本老妇| 国产欧美一区二区精品性色 | 麻花传媒剧在线MV免费观看| 啊别插了视频髙清在线观看 | 日本大一大二大三在一起读吗| 国产精品门事件AV| 亚洲熟妇无码AV| 让人爽到湿的小黄书软件下载| 动漫精品视频一区二区三区| 亚洲αⅴ无码乱码在线观看性色| 麻豆国产蜜桃臀视频在线观看| 差差漫画免费页面漫画在线观看| 性欧美VIDEOFREE高清成| 麻花传媒MV与其它传媒公司比较| 成人无码AⅤ久久精品国产传媒| 亚洲AV日韩AⅤ无码色老头| 男女做高潮120秒试看| 国产成人免费无码AV在线播放| 亚洲国产精品人人爽夜夜爽| 内射人妻无码色AV| 国产精品秘 入口A级熟女| 影帝隔着内裤滑进去了H| 色偷拍 自怕 亚洲 10P| 精品水蜜桃久久久久久久| А√天堂8在线官网| 亚洲AV无码乱码在线观看裸奔| 妺妺窝人体色聚窝窝| 国产精品成人久久电影| 在公交上被灌满白浆的视频 | 人妻丰满熟妇无码AV| 狠狠躁夜夜躁人人爽碰AV| 被陌生人带去卫生间啪到腿软| 亚洲国产超清无码专区| 人妻有码中文字幕|