最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 異常捕獲及處理案例詳解

 更新時間:2021年09月01日 16:59:06   作者:Superme_No1  
這篇文章主要介紹了java 異常捕獲及處理案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、Java異常簡介

什么是異常?

程序運(yùn)行時,發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。異常發(fā)生時,是任程序自生自滅,立刻退出終止。在Java中即,Java在編譯或運(yùn)行或者運(yùn)行過程中出現(xiàn)的錯誤。

Java提供了更加優(yōu)秀的解決辦法:異常處理機(jī)制。

異常處理機(jī)制能讓程序在異常發(fā)生時,按照代碼的預(yù)先設(shè)定的異常處理邏輯,針對性地處理異常,讓程序盡最大可能恢復(fù)正常并繼續(xù)執(zhí)行,且保持代碼的清晰。
Java中的異??梢允呛瘮?shù)中的語句執(zhí)行時引發(fā)的,也可以是程序員通過throw 語句手動拋出的,只要在Java程序中產(chǎn)生了異常,就會用一個對應(yīng)類型的異常對象來封裝異常,JRE就會試圖尋找異常處理程序來處理異常。

Java異常機(jī)制用到的幾個關(guān)鍵字:try、catch、finally、throw、throws。

  •  try        -- 用于監(jiān)聽。將要被監(jiān)聽的代碼(可能拋出異常的代碼)放在try語句塊之內(nèi),當(dāng)try語句塊內(nèi)發(fā)生異常時,異常就被拋出。
  • catch   -- 用于捕獲異常。catch用來捕獲try語句塊中發(fā)生的異常。
  • finally  -- finally語句塊總是會被執(zhí)行。它主要用于回收在try塊里打開的物力資源(如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件)。只有finally塊,執(zhí)行完成之后,才會回來執(zhí)行try或者catch塊中的return或者throw語句,如果finally中使用了return或者throw等終止方法的語句,則就不會跳回執(zhí)行,直接停止。
  • throw   -- 用于拋出異常。
  • throws -- 用在方法簽名中,用于聲明該方法可能拋出的異常。主方法上也可以使用throws拋出。如果在主方法上使用了throws拋出,就表示在主方法里面可以不用強(qiáng)制性進(jìn)行異常處理,如果出現(xiàn)了異常,就交給JVM進(jìn)行默認(rèn)處理,則此時會導(dǎo)致程序中斷執(zhí)行。

產(chǎn)生異常的原因:

  • 用戶輸入了非法數(shù)據(jù)。
  • 要打開的文件不存在。
  • 網(wǎng)絡(luò)通信時連接中斷,或者JVM內(nèi)存溢出。

這些異常有的是因?yàn)橛脩翦e誤引起,有的是程序錯誤引起的,還有其它一些是因?yàn)槲锢礤e誤引起的。

三種類型的異常:

  • 檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預(yù)見的。例如要打開一個不存在文件時,一個異常就發(fā)生了,這些異常在編譯時不能被簡單地忽略。
  • 運(yùn)行時異常: 運(yùn)行時異常是可能被程序員避免的異常。與檢查性異常相反,運(yùn)行時異??梢栽诰幾g時被忽略。
  • 錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當(dāng)棧溢出時,一個錯誤就發(fā)生了,它們在編譯也檢查不到的。

二、Java異常的分類

異常的根接口Throwable,其下有2個子接口,Error和Exception。

  • Error:指的是JVM錯誤,這時的程序并沒有執(zhí)行,無法處理;
  • Exception:指的是程序運(yùn)行中產(chǎn)生的異常,用戶可以使用處理格式處理。

Java 內(nèi)置異常類

Java 語言定義了一些異常類在 java.lang 標(biāo)準(zhǔn)包中。

標(biāo)準(zhǔn)運(yùn)行時異常類的子類是最常見的異常類。由于 java.lang 包是默認(rèn)加載到所有的 Java 程序的,所以大部分從運(yùn)行時異常類繼承而來的異常都可以直接使用。

Java 根據(jù)各個類庫也定義了一些其他的異常,下面的表中列出了 Java 的非檢查性異常。

異常 描述
ArithmeticException 當(dāng)出現(xiàn)異常的運(yùn)算條件時,拋出此異常。例如,一個整數(shù)"除以零"時,拋出此類的一個實(shí)例。
ArrayIndexOutOfBoundsException 用非法索引訪問數(shù)組時拋出的異常。如果索引為負(fù)或大于等于數(shù)組大小,則該索引為非法索引。
ArrayStoreException 試圖將錯誤類型的對象存儲到一個對象數(shù)組時拋出的異常。
ClassCastException 當(dāng)試圖將對象強(qiáng)制轉(zhuǎn)換為不是實(shí)例的子類時,拋出該異常。
IllegalArgumentException 拋出的異常表明向方法傳遞了一個不合法或不正確的參數(shù)。
IllegalMonitorStateException 拋出的異常表明某一線程已經(jīng)試圖等待對象的監(jiān)視器,或者試圖通知其他正在等待對象的監(jiān)視器而本身沒有指定監(jiān)視器的線程。
IllegalStateException 在非法或不適當(dāng)?shù)臅r間調(diào)用方法時產(chǎn)生的信號。換句話說,即 Java 環(huán)境或 Java 應(yīng)用程序沒有處于請求操作所要求的適當(dāng)狀態(tài)下。
IllegalThreadStateException 線程沒有處于請求操作所要求的適當(dāng)狀態(tài)時拋出的異常。
IndexOutOfBoundsException 指示某排序索引(例如對數(shù)組、字符串或向量的排序)超出范圍時拋出。
NegativeArraySizeException 如果應(yīng)用程序試圖創(chuàng)建大小為負(fù)的數(shù)組,則拋出該異常。
NullPointerException 當(dāng)應(yīng)用程序試圖在需要對象的地方使用 null 時,拋出該異常
NumberFormatException 當(dāng)應(yīng)用程序試圖將字符串轉(zhuǎn)換成一種數(shù)值類型,但該字符串不能轉(zhuǎn)換為適當(dāng)格式時,拋出該異常。
SecurityException 由安全管理器拋出的異常,指示存在安全侵犯。
StringIndexOutOfBoundsException 此異常由 String 方法拋出,指示索引或者為負(fù),或者超出字符串的大小。
UnsupportedOperationException 當(dāng)不支持請求的操作時,拋出該異常。

下面的表中列出了 Java 定義在 java.lang 包中的檢查性異常類。

異常 描述
ClassNotFoundException 應(yīng)用程序試圖加載類時,找不到相應(yīng)的類,拋出該異常。
CloneNotSupportedException 當(dāng)調(diào)用 Object 類中的 clone 方法克隆對象,但該對象的類無法實(shí)現(xiàn) Cloneable 接口時,拋出該異常。
IllegalAccessException 拒絕訪問一個類的時候,拋出該異常。
InstantiationException 當(dāng)試圖使用 Class 類中的 newInstance 方法創(chuàng)建一個類的實(shí)例,而指定的類對象因?yàn)槭且粋€接口或是一個抽象類而無法實(shí)例化時,拋出該異常。
InterruptedException 一個線程被另一個線程中斷,拋出該異常。
NoSuchFieldException 請求的變量不存在
NoSuchMethodException 請求的方法不存在

異常方法

下面的列表是 Throwable 類的主要方法:

序號 方法及說明
1 public String getMessage()
返回關(guān)于發(fā)生的異常的詳細(xì)信息。這個消息在Throwable 類的構(gòu)造函數(shù)中初始化了。
2 public Throwable getCause()
返回一個Throwable 對象代表異常原因。
3 public String toString()
使用getMessage()的結(jié)果返回類的串級名字。
4 public void printStackTrace()
打印toString()結(jié)果和棧層次到System.err,即錯誤輸出流。
5 public StackTraceElement [] getStackTrace()
返回一個包含堆棧層次的數(shù)組。下標(biāo)為0的元素代表?xiàng)m?,最后一個元素代表方法調(diào)用堆棧的棧底。
6 public Throwable fillInStackTrace()
用當(dāng)前的調(diào)用棧層次填充Throwable 對象棧層次,添加到棧層次任何先前信息中。

三、異常的使用及執(zhí)行流程

1、異常的處理方案

try...catch、try...catch...finally、try...finally
try{
可能會發(fā)生的異常
}catch(異常類型 異常名(變量)){
針對異常進(jìn)行處理的代碼
}catch(異常類型 異常名(變量)){
針對異常進(jìn)行處理的代碼
}...
[finally{
釋放資源代碼;
}]

注意:

  • catch 不能獨(dú)立于 try 存在。
  • catch里面不能沒有內(nèi)容
  • 在 try/catch 后面添加 finally 塊并非強(qiáng)制性要求的。
  • try 代碼后不能既沒 catch 塊也沒 finally 塊。
  • try里面越少越好。
  • try, catch, finally 塊之間不能添加任何代碼。
  • finally里面的代碼最終一定會執(zhí)行(除了JVM退出)
  • 如果程序可能存在多個異常,需要多個catch進(jìn)行捕獲。
  • 異常如果是同級關(guān)系,catch誰前誰后沒有關(guān)系
    如果異常之間存在上下級關(guān)系,上級需要放在后面

2、異常的執(zhí)行流程

Error與Exception的區(qū)別:

Error(錯誤)是系統(tǒng)中的錯誤,程序員是不能改變的和處理的,是在程序編譯時出現(xiàn)的錯誤,只能通過修改程序才能修正。一般是指與虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰,虛擬機(jī)錯誤,內(nèi)存空間不足,方法調(diào)用棧溢等。對于這類錯誤的導(dǎo)致的應(yīng)用程序中斷,僅靠程序本身無法恢復(fù)和和預(yù)防,遇到這樣的錯誤,建議讓程序終止。

Exception(異常)表示程序可以處理的異常,可以捕獲且可能恢復(fù)。遇到這類異常,應(yīng)該盡可能處理異常,使程序恢復(fù)運(yùn)行,而不應(yīng)該隨意終止異常。

在catch捕獲異常時,為什么不考慮使用Throwable類型,而只是使用Exception來進(jìn)行接收?

Throwable表示的范圍要比Exception大。實(shí)際上程序使用Throwable來進(jìn)行處理,沒有任何語法問題,但是卻會存在邏輯問題。因?yàn)榇藭r出現(xiàn)的(或者說用戶能夠處理的)只有Exception類型,而如果使用Throwable接收,還會表示可以處理Error的錯誤,而用戶是處理不了Error錯誤的,所以在開發(fā)中用戶可以處理的異常都要求以Exception類為主。

異常是一起處理好還是分開處理好?

根據(jù)實(shí)際的開發(fā)要求是否嚴(yán)格來決定。在實(shí)際的項(xiàng)目開發(fā)項(xiàng)目工作中,所有的異常是統(tǒng)一使用Exception處理還是分開處理,完全根據(jù)開發(fā)者的項(xiàng)目開發(fā)標(biāo)準(zhǔn)來決定。如果項(xiàng)目開發(fā)環(huán)境嚴(yán)謹(jǐn),基本上要求針對每一種異常分別進(jìn)行處理,并且要詳細(xì)記錄下異常產(chǎn)生的時間以及產(chǎn)生的位置,這樣可以方便程序維護(hù)人員進(jìn)行代碼的維護(hù)。再次注意:處理多個異常時,捕獲范圍小的異常要放在捕獲范圍大的異常之前處理。

throw和throws的區(qū)別?

throw和throws都是在異常處理中使用的關(guān)鍵字,區(qū)別如下:

  • throw:指的是在方法中人為拋出一個異常對象(這個異常對象可能是自己實(shí)例化或者拋出已存在的);
  • throws:在方法的聲明上使用,表示此方法在調(diào)用時必須處理異常。

檢查型異常(Checked Exception)與非檢查型異常(Unchecked Exception)區(qū)別?

  • 所有的檢查性異常都繼承自java.lang.Exception;所有的非檢查性異常都繼承自java.lang.RuntimeEx ception。
  • 檢查性異常和非檢查性異常最主要的區(qū)別在于其處理異常的方式:檢查性異常必須使用try catch或者throws等關(guān)鍵字進(jìn)行處理,否則編譯器會報錯;非檢查性異常一般是程序代碼寫的不夠嚴(yán)謹(jǐn)而導(dǎo)致的問題,可以通過修改代碼來規(guī)避。
  • 常見的運(yùn)行時異常:空指針異常(NullPointerException)、除零異常(ArithmeticException)、數(shù)組越界異常(ArrayIndexOutOfBoundsException)等;
  • 常見的檢查性異常:輸入輸出異常(IOException)、文件不存在異常(FileNotFoundException)、SQL語句異常(SQLException)等。

assert關(guān)鍵字(了解)

在Java中,assert關(guān)鍵字是從JAVA SE 1.4 引入的,為了避免和老版本的Java代碼中使用了assert關(guān)鍵字導(dǎo)致錯誤,Java在執(zhí)行的時候默認(rèn)是不啟動斷言檢查的(這個時候,所有的斷言語句都 將忽略?。绻_啟斷言檢查,則需要用開關(guān)-enableassertions或-ea來開啟。

assert關(guān)鍵字語法很簡單,有兩種用法:

  1. assert <boolean表達(dá)式>
    如果<boolean表達(dá)式>為true,則程序繼續(xù)執(zhí)行。
    如果為false,則程序拋出AssertionError,并終止執(zhí)行。
  2. assert <boolean表達(dá)式> : <錯誤信息表達(dá)式>
    如果<boolean表達(dá)式>為true,則程序繼續(xù)執(zhí)行。
    如果為false,則程序拋出java.lang.AssertionError,并輸入<錯誤信息表達(dá)式>。

例如:

public class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 2;
		assert a == 10:"a不等于10";
		System.out.println("a="+a);
	}
}

執(zhí)行結(jié)果為:

public class Test {
	public static void main(String[] args) {
		int a = 10;
		int b = 2;
		assert a == 20:"a不等于20";
		System.out.println("a="+a);
	}
}

執(zhí)行結(jié)果為:

四、自定義異常

在 Java 中你可以自定義異常。如果要自定義異常類,則擴(kuò)展Exception類即可,因此這樣的自定義異常都屬于檢查異常(checked exception)。如果要自定義非檢查異常,則擴(kuò)展自RuntimeException。

按照國際慣例,自定義的異常應(yīng)該總是包含如下的構(gòu)造函數(shù):

  • 一個無參構(gòu)造函數(shù)
  • 一個帶有String參數(shù)的構(gòu)造函數(shù),并傳遞給父類的構(gòu)造函數(shù)。
  • 一個帶有String參數(shù)和Throwable參數(shù),并都傳遞給父類構(gòu)造函數(shù)
  • 一個帶有Throwable 參數(shù)的構(gòu)造函數(shù),并傳遞給父類的構(gòu)造函數(shù)。

下面是IOException類的完整源代碼,可以借鑒。

package java.io;
 
public class IOException extends Exception {
    static final long serialVersionUID = 7818375828146090155L;
 
    public IOException() {
	super();
    }
 
    public IOException(String message) {
	super(message);
    }
 
    public IOException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public IOException(Throwable cause) {
        super(cause);
    }
}

finally塊和return

  • 首先一個不容易理解的事實(shí):在 try塊中即便有return,break,continue等改變執(zhí)行流的語句,finally也會執(zhí)行。
  • finally中的return 會覆蓋 try 或者catch中的返回值。
  • finally中的return或異常會抑制(消滅)前面try或者catch塊中的異常。

到此這篇關(guān)于java 異常捕獲及處理案例詳解的文章就介紹到這了,更多相關(guān)java 異常捕獲及處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用Java實(shí)現(xiàn)一個靜態(tài)鏈表的方法步驟

    用Java實(shí)現(xiàn)一個靜態(tài)鏈表的方法步驟

    這篇文章主要介紹了用Java實(shí)現(xiàn)一個靜態(tài)鏈表的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java中final關(guān)鍵字和final的4種用法

    Java中final關(guān)鍵字和final的4種用法

    這篇文章主要給大家分享的是?Java中final關(guān)鍵字和final的4種用法修飾類、修飾方法、修飾變量、修飾參數(shù),下面文章具有一定的參考價值,需要的小伙伴可以參考一下
    2021-11-11
  • java冒泡排序和選擇排序示例

    java冒泡排序和選擇排序示例

    這篇文章主要介紹了java冒泡排序和選擇排序示例,需要的朋友可以參考下
    2014-05-05
  • Java反射機(jī)制介紹

    Java反射機(jī)制介紹

    Java的反射機(jī)制是在運(yùn)行狀態(tài)中,對于任何一個類,都可以知道這個類的所有屬性和方法,對于任何一個對象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息,這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為Java的反射機(jī)制
    2022-08-08
  • Spring中BeanFactory和ApplicationContext的作用和區(qū)別(推薦)

    Spring中BeanFactory和ApplicationContext的作用和區(qū)別(推薦)

    這篇文章主要介紹了Spring中BeanFactory和ApplicationContext的作用和區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java截取圖片示例

    java截取圖片示例

    這篇文章主要介紹了java截取圖片示例,把代碼中的圖片路徑改成自己的圖片,運(yùn)行就可以看到效果了,需要的朋友可以參考下
    2014-03-03
  • java垃圾回收之實(shí)現(xiàn)串行GC算法

    java垃圾回收之實(shí)現(xiàn)串行GC算法

    學(xué)習(xí)了GC算法的相關(guān)概念之后,?我們將介紹在JVM中這些算法的具體實(shí)現(xiàn)。首先要記住的是,?大多數(shù)JVM都需要使用兩種不同的GC算法?——?一種用來清理年輕代,?另一種用來清理老年代
    2022-01-01
  • Java實(shí)現(xiàn)ftp上傳下載、刪除文件及在ftp服務(wù)器上傳文件夾的方法

    Java實(shí)現(xiàn)ftp上傳下載、刪除文件及在ftp服務(wù)器上傳文件夾的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)ftp上傳下載、刪除文件及在ftp服務(wù)器上傳文件夾的方法,需要的朋友可以參考下
    2015-11-11
  • Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對Filter配置的影響

    關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType

    這篇文章主要介紹了關(guān)于request.getRequestDispatcher().forward()的妙用及DispatcherType對Filter配置的影響,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

当雄县| 仪陇县| 开原市| 西峡县| 阆中市| 鄢陵县| 温州市| 西峡县| 若羌县| 济阳县| 三河市| 会昌县| 江安县| 平安县| 北票市| 芒康县| 行唐县| 来凤县| 平远县| 阜阳市| 田林县| 土默特右旗| 恭城| 苏尼特右旗| 吉首市| 华池县| 尤溪县| 白河县| 湟中县| 新晃| 昆明市| 平乡县| 西藏| 读书| 类乌齐县| 海淀区| 青川县| 红安县| 石楼县| 黄大仙区| 蓬安县|