Java程序常見(jiàn)異常及處理匯總
一、JDK中常見(jiàn)的異常情況
1、常見(jiàn)異常總結(jié)圖
2、java中異常分類(lèi)
Throwable類(lèi)有兩個(gè)直接子類(lèi):
(1)Exception:出現(xiàn)的問(wèn)題是可以被捕獲的
(2)Error:系統(tǒng)錯(cuò)誤,通常由JVM處理
3、被捕獲的異常分類(lèi)
(1)Check異常: 派生自Exception的異常類(lèi),必須被捕獲或再次聲明拋出
(2)Runtime異常:派生自RuntimeException的異常類(lèi)。使用throw語(yǔ)句可以隨時(shí)拋出這種異常對(duì)象 throw new ArithmeticException(…);
二、發(fā)生異常的原因
1、用戶(hù)輸入了非法數(shù)據(jù)。
2、要打開(kāi)的文件不存在。
3、網(wǎng)絡(luò)通信是連接中斷
4、JVM內(nèi)存溢出
三、java程序中幾種常見(jiàn)的異常以及出現(xiàn)此異常的原因
1、java.lang.NullpointerException(空指針異常)
原因:這個(gè)異常經(jīng)常遇到,異常的原因是程序中有空指針,即程序中調(diào)用了未經(jīng)初始化的對(duì)象或者是不存在的對(duì)象。
經(jīng)常出現(xiàn)在創(chuàng)建對(duì)象,調(diào)用數(shù)組這些代碼中,比如對(duì)象未經(jīng)初始化,或者圖片創(chuàng)建時(shí)的路徑錯(cuò)誤等等。對(duì)數(shù)組代碼
中出現(xiàn)空指針,是把數(shù)組的初始化和數(shù)組元素的初始化搞混淆了。數(shù)組的初始化是對(duì)數(shù)組分配空間,而數(shù)組元素的
初始化,是給數(shù)組中的元素賦初始值
2、 java.lang.ClassNotFoundException(指定的類(lèi)不存在)
原因:當(dāng)試圖將一個(gè)String類(lèi)型數(shù)據(jù)轉(zhuǎn)換為指定的數(shù)字類(lèi)型,但該字符串不滿(mǎn)足數(shù)值型數(shù)據(jù)的要求時(shí),就拋出這個(gè)異
常。例如將String類(lèi)型的數(shù)據(jù)"123456"轉(zhuǎn)換為數(shù)值型數(shù)據(jù)時(shí),是可以轉(zhuǎn)換的的。但是如果String類(lèi)型的數(shù)據(jù)中包含了
非數(shù)字型的字符,如123*56,此時(shí)轉(zhuǎn)換為數(shù)值型時(shí)就會(huì)出現(xiàn)異常。系統(tǒng)就會(huì)捕捉到這個(gè)異常,并進(jìn)行處理
3、java.lang.ClassNotFoundExceptio(指定的類(lèi)不存在)
原因:是因?yàn)轭?lèi)的名稱(chēng)和路徑不正確,通常都是程序試圖通過(guò)字符串來(lái)加載某個(gè)類(lèi)的時(shí)候可能會(huì)引發(fā)異常。例如:
調(diào)用Class.forName()、或者調(diào)用ClassLoad的finaSystemClass()、或者是LoadClass()時(shí)出現(xiàn)異常
4、java.lang.IndexOutOfBoundsException(數(shù)組下標(biāo)越界異常)
原因:查看程序中調(diào)用的數(shù)組或者字符串的下標(biāo)值是不是超出了數(shù)組的范圍,一般來(lái)說(shuō),顯示調(diào)用數(shù)組不太容易出這
樣的錯(cuò),但隱式調(diào)用就有可能出錯(cuò)了,還有一種情況,是程序中定義的數(shù)組的長(zhǎng)度是通過(guò)某些特定方法決定的,不是
事先聲明的,這個(gè)時(shí)候可以先查看一下數(shù)組的length,以免出現(xiàn)這個(gè)異常
5、java.lang.IllegalArgumentException(方法的參數(shù)錯(cuò)誤)
例如g.setColor(int red,int green,int blue)這個(gè)方法中的三個(gè)值,如果有超過(guò)255的會(huì)出現(xiàn)這個(gè)異常,如果程
序中存在這個(gè)異常,就要去檢查一下方法調(diào)用中的參數(shù)傳遞或參數(shù)值是不是有錯(cuò)
6、java.lang.IllegalAccessException(沒(méi)有訪(fǎng)問(wèn)權(quán)限)
當(dāng)程序要調(diào)用一個(gè)類(lèi),但當(dāng)前的方法即沒(méi)有對(duì)該類(lèi)的訪(fǎng)問(wèn)權(quán)限便會(huì)出現(xiàn)這個(gè)異常。如果程序中用了Package的情況下
有可能出現(xiàn)這個(gè)異常
7、java.lang.ArithmeticException(數(shù)學(xué)運(yùn)算異常)
當(dāng)數(shù)學(xué)運(yùn)算中出現(xiàn)了除以零這樣的運(yùn)算就會(huì)出這樣的異常。
8、java.lang.ClassCastException(數(shù)據(jù)類(lèi)型轉(zhuǎn)換異常)
當(dāng)試圖將對(duì)某個(gè)對(duì)象強(qiáng)制執(zhí)行向下轉(zhuǎn)換,但該對(duì)象又不可轉(zhuǎn)換或又不可轉(zhuǎn)換為其子類(lèi)的實(shí)例時(shí)將出現(xiàn)該異常
9、 java.lang.FileNotFoundException(文件未找到異常)
當(dāng)程序打開(kāi)一個(gè)不存在的文件來(lái)進(jìn)行讀寫(xiě)時(shí)將會(huì)引發(fā)該異常。該異常由FileInputStream,FileOutputStream,
RandomAccessFile的構(gòu)造器聲明拋出,即使被操作的文件存在,但是由于某些原因不可訪(fǎng)問(wèn),比如打開(kāi)一個(gè)
只有只讀權(quán)限的文件并向其中寫(xiě)入數(shù)據(jù),以上構(gòu)造方法依然會(huì)引發(fā)異常
10、java.lang.ArrayStoreException(數(shù)組存儲(chǔ)異常)
當(dāng)試圖將類(lèi)型為不兼容類(lèi)型的對(duì)象存入一個(gè)Object[]數(shù)組時(shí)將引發(fā)異常
11、java.lang.NoSuchMethodException(方法不存在異常)
當(dāng)程序試圖通過(guò)反射來(lái)創(chuàng)建對(duì)象,訪(fǎng)問(wèn)(修改或讀取)某個(gè)方法,但是該方法不存在就會(huì)引發(fā)異常。
12、 java.lang.EOFException(文件已結(jié)束異常)
當(dāng)程序在輸入的過(guò)程中遇到文件或流的結(jié)尾時(shí),引發(fā)異常。因此該異常用于檢查是否達(dá)到文件或流的結(jié)尾
13、java.lang.InstantiationException(實(shí)例化異常)
當(dāng)試圖通過(guò)Class的newInstance()方法創(chuàng)建某個(gè)類(lèi)的實(shí)例,但程序無(wú)法通過(guò)該構(gòu)造器來(lái)創(chuàng)建該對(duì)象時(shí)引發(fā)。
Class對(duì)象表示一個(gè)抽象類(lèi),接口,數(shù)組類(lèi),基本類(lèi)型 。該Class表示的類(lèi)沒(méi)有對(duì)應(yīng)的構(gòu)造器。
14、java.lang.InterruptedException(被中止異常)
當(dāng)某個(gè)線(xiàn)程處于長(zhǎng)時(shí)間的等待、休眠或其他暫停狀態(tài),而此時(shí)其他的線(xiàn)程通過(guò)Thread的interrupt方法終止該線(xiàn)程時(shí)拋出該異常。
15、java.lang.CloneNotSupportedException (不支持克隆異常)
當(dāng)沒(méi)有實(shí)現(xiàn)Cloneable接口或者不支持克隆方法時(shí),調(diào)用其clone()方法則拋出該異常
16、java.lang.OutOfMemoryException (內(nèi)存不足錯(cuò)誤)
當(dāng)可用內(nèi)存不足以讓Java虛擬機(jī)分配給一個(gè)對(duì)象時(shí)拋出該錯(cuò)誤
17、java.lang.NoClassDefFoundException (未找到類(lèi)定義錯(cuò)誤)
當(dāng)Java虛擬機(jī)或者類(lèi)裝載器試圖實(shí)例化某個(gè)類(lèi),而找不到該類(lèi)的定義時(shí)拋出該錯(cuò)誤
四、Java異常處理的總結(jié)
1、不要丟棄異常,捕獲異常后需要進(jìn)行相關(guān)處理。如果用戶(hù)覺(jué)得不能很好地處理該異常,就讓它繼續(xù)傳播,傳到別的地方去處理,或者把一個(gè)低級(jí)的異常轉(zhuǎn)換成應(yīng)用級(jí)的異常,重新拋出
2、catch語(yǔ)句應(yīng)該指定具體的異常類(lèi)型。不能把不該捕獲的異常也捕獲了
3、在finally里面釋放資源。如果finally里面也會(huì)拋出異常,也一樣需要使用try..catch處理
4、不要把大量的代碼塞在try...catch塊里面,分離各個(gè)可能出現(xiàn)異常的語(yǔ)句并分別捕獲異常
5、由于異??赡軐?dǎo)致輸出的數(shù)據(jù)不完整,因此用戶(hù)需要作出相對(duì)應(yīng)的處理,至少應(yīng)該提示該數(shù)據(jù)的不完整
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Netty分布式客戶(hù)端處理接入事件handle源碼解析
這篇文章主要為大家介紹了Netty源碼分析客戶(hù)端流程處理接入事件handle創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載
這篇文章主要介紹了Spring?Boot?如何動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載,現(xiàn)項(xiàng)目有一個(gè)需求,期望通過(guò)在application.yml配置文件中設(shè)置一個(gè)開(kāi)關(guān),來(lái)決定是否加載數(shù)據(jù)庫(kù),文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-10-10Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法,結(jié)合實(shí)例形式詳細(xì)分析了二叉樹(shù)的定義、深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法原理與相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04Java實(shí)現(xiàn)根據(jù)地址智能識(shí)別省市區(qū)縣
這篇文章主要為大家詳細(xì)介紹了如何編寫(xiě)一個(gè)Java工具類(lèi),可以根據(jù)身份證地址或用戶(hù)輸入的地址,智能識(shí)別并提取出詳細(xì)的省市區(qū)縣信息,感興趣的小伙伴可以了解下2025-03-03使用Java實(shí)現(xiàn)Excel導(dǎo)入并進(jìn)行數(shù)據(jù)校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)下載的指定數(shù)據(jù)模板寫(xiě)入數(shù)據(jù)和導(dǎo)入并進(jìn)行數(shù)據(jù)校驗(yàn),文中的示例代碼講解詳細(xì),需要的可以了解下2025-03-03Spring項(xiàng)目中swagger用法與swagger-ui使用
這篇文章主要介紹了Spring項(xiàng)目中swagger用法與swagger-ui使用,通過(guò)圖文并茂的形式給大家介紹了編寫(xiě)springboot項(xiàng)目的方法及導(dǎo)入spring-fox依賴(lài)的代碼詳解,需要的朋友可以參考下2021-05-05springboot如何接收application/x-www-form-urlencoded類(lèi)型的請(qǐng)求
這篇文章主要介紹了springboot如何接收application/x-www-form-urlencoded類(lèi)型的請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java多線(xiàn)程教程之如何利用Future實(shí)現(xiàn)攜帶結(jié)果的任務(wù)
Callable與Future兩功能是Java?5版本中加入的,這篇文章主要給大家介紹了關(guān)于Java多線(xiàn)程教程之如何利用Future實(shí)現(xiàn)攜帶結(jié)果任務(wù)的相關(guān)資料,需要的朋友可以參考下2021-12-12Springboot Thymeleaf字符串對(duì)象實(shí)例解析
這篇文章主要介紹了Springboot Thymeleaf字符串對(duì)象實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2007-09-09