帶你全面認(rèn)識(shí)Java中的異常處理
Java異常處理
異常體系的介紹
什么事異常處理?
異常是程序在“編譯”或者“執(zhí)行”的過(guò)程中可能出現(xiàn)的問(wèn)題,比如: 數(shù)組索引越界、空指針異常、 日期格式化異常,等…
注意:語(yǔ)法錯(cuò)誤不算在異常體系中。
為什么要學(xué)習(xí)異常?
異常一旦出現(xiàn)了,如果沒(méi)有提前處理,程序就會(huì)退出JVM虛擬機(jī)而終止.
研究異常是為了避免異常,然后提前處理異常,體現(xiàn)的是程序的安全, 健壯性。

Error:是系統(tǒng)級(jí)別問(wèn)題、JVM退出等,代碼無(wú)法控制。
Exception:java.lang包下,稱為異常類,它表示程序本身可以處理的問(wèn)題
RuntimeException及其子類:統(tǒng)稱為運(yùn)行時(shí)異常,編譯階段不會(huì)報(bào)錯(cuò)。 (空指針異常,數(shù)組索引越界異常)除RuntimeException之外所有的異常:統(tǒng)稱為編譯時(shí)異常,編譯期必須處理的,否則程序不能通過(guò)編譯。 (日期格式化異常)。
編譯時(shí)異常和運(yùn)行時(shí)異常:

簡(jiǎn)單來(lái)說(shuō):
編譯時(shí)異常就是在編譯的時(shí)候出現(xiàn)的異常,
運(yùn)行時(shí)異常就是在運(yùn)行時(shí)出現(xiàn)的異常。
常見(jiàn)運(yùn)行時(shí)異常
運(yùn)行時(shí)異常;
直接繼承自RuntimeException或者其子類,編譯階段不會(huì)報(bào)錯(cuò),運(yùn)行時(shí)可能出現(xiàn)的錯(cuò)誤。
常見(jiàn)的運(yùn)行時(shí)異常示例:
數(shù)組索引越界異常:
ArrayIndexOutOfBoundsException
public static void main(String[] args) {
// 數(shù)組索引越界異常: ArrayIndexOutOfBoundsException
int[] arr = {10, 20, 40};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]); // 越界
// 異常提示:
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// at com.chenyq.d6_exception.ExceptionDemo.main(ExceptionDemo.java:11)
}
空指針異常 : NullPointerException,直接輸出沒(méi)有問(wèn)題,但是調(diào)用空指針的變量的功能就會(huì)報(bào)錯(cuò)。
public static void main(String[] args) {
String name = null;
System.out.println(name.length()); // 空指針異常
// 異常信息:
// Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "name" is null
// at com.chenyq.d6_exception.ExceptionDemo2.main(ExceptionDemo2.java:6)
}
數(shù)學(xué)操作異常:ArithmeticException
public static void main(String[] args) {
int c = 20 / 0; // 數(shù)學(xué)異常, 分母不能為0
// 異常信息:
// Exception in thread "main" java.lang.ArithmeticException: / by zero
// at com.chenyq.d6_exception.ExceptionDemo4.main(ExceptionDemo4.java:5)
}
類型轉(zhuǎn)換異常:ClassCastException
public static void main(String[] args) {
Object obj = 12;
String str = (String) obj; // 類型轉(zhuǎn)換異常
// 異常信息
// Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class
// java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
// at com.chenyq.d6_exception.ExceptionDemo3.main(ExceptionDemo3.java:6
}
數(shù)字轉(zhuǎn)換異常: NumberFormatException
public static void main(String[] args) {
String num1 = "23"; // 可以正常轉(zhuǎn)換
Integer res1 = Integer.valueOf(num1);
System.out.println(res1 + 1);
String num2 = "23aaa"; // 不可以正常轉(zhuǎn)換 數(shù)字轉(zhuǎn)換異常
Integer res2 = Integer.valueOf(num2);
System.out.println(res2 + 1);
// 異常信息
// Exception in thread "main" java.lang.NumberFormatException: For input string: "23aaa"
// at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
// at java.base/java.lang.Integer.parseInt(Integer.java:668)
// at java.base/java.lang.Integer.valueOf(Integer.java:999)
// at com.chenyq.d6_exception.ExceptionDemo5.main(ExceptionDemo5.java:10)
}
運(yùn)行時(shí)異常:一般是程序員業(yè)務(wù)沒(méi)有考慮好或者是編程邏輯不嚴(yán)謹(jǐn)引起的程序錯(cuò)誤,自己水平問(wèn)題
常見(jiàn)編譯時(shí)異常
編譯時(shí)異常:
不是RuntimeException或者其子類的異常,編譯階段就報(bào)錯(cuò)(代碼寫(xiě)出來(lái)就報(bào)錯(cuò)),必須處理,否則代碼不通過(guò)
編譯時(shí)異常示例:

編譯時(shí)異常的作用是什么:
是擔(dān)心程序員的技術(shù)不行,在編譯階段就爆出一個(gè)錯(cuò)誤, 目的在于提醒代碼可能有錯(cuò)誤
編譯時(shí)異常是可遇不可求, 遇到了解決即可。
補(bǔ)充:自定義異常
Java 中雖然已經(jīng)內(nèi)置了豐富的異常類, 但是我們實(shí)際場(chǎng)景中可能還有一些情況需要我們對(duì)異常類進(jìn)行擴(kuò)展, 創(chuàng)建符合我們實(shí)際情況的異常.
我們可以通過(guò)一個(gè)例子來(lái)說(shuō)明一下:模擬用戶登錄,此時(shí)就可能拋出兩種異常,一種是用戶名錯(cuò)誤異常,一種是密碼錯(cuò)誤異常:
我們先寫(xiě)出一段模擬登錄的代碼
public class winning {
private static final String ID ="java";
private static final String Password = "666";
public static void main(String[] args) {
System.out.println("請(qǐng)輸入你的用戶名");
Scanner scanner=new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("請(qǐng)輸入你的密碼");
String password = scanner.nextLine();
}
}
定義拋出用戶名錯(cuò)誤的異常類
//定義一個(gè)用戶名異常
class NameException extends RuntimeException{
public NameException(String name){
super(name);
}
}
定義拋出密碼錯(cuò)誤的異常
//定義一個(gè)密碼異常
class PasswordException extends RuntimeException{
public PasswordException(String password){
super(password);
}
}
我們?cè)谶M(jìn)一步完善我們異常處理機(jī)制:
public class winning {
private static final String ID ="java";
private static final String Password = "666";
public static void main(String[] args) {
System.out.println("請(qǐng)輸入你的用戶名");
Scanner scanner=new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("請(qǐng)輸入你的密碼");
String password = scanner.nextLine();
if (!ID.equals(name)){
throw new NameException("用戶名錯(cuò)了");
}
if (!Password.equals(password)){
throw new PasswordException("密碼有誤");
}
}
}通過(guò)這個(gè)例子,讓我們了解什么是自定義異常類,如何使用異常類,當(dāng)然以上代碼可以進(jìn)行優(yōu)化,可以利用設(shè)置一個(gè)login登錄函數(shù),在利用try-catch進(jìn)行捕獲異常。
總結(jié)
到此這篇關(guān)于Java中異常處理的文章就介紹到這了,更多相關(guān)Java中異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法
這篇文章主要介紹了SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Java通過(guò)Fork/Join優(yōu)化并行計(jì)算
這篇文章主要為大家詳細(xì)介紹了Java通過(guò)Fork、Join來(lái)優(yōu)化并行計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例
本篇文章主要介紹了Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例,詳細(xì)的介紹了通過(guò)讀取Socket的輸入流來(lái)實(shí)現(xiàn)一個(gè)文件上傳的功能,有興趣的同學(xué)可以一起了解一下2017-04-04
SpringCloud學(xué)習(xí)筆記之SpringCloud搭建父工程的過(guò)程圖解
SpringCloud是分布式微服務(wù)架構(gòu)的一站式解決方案,十多種微服務(wù)架構(gòu)落地技術(shù)的集合體,俗稱微服務(wù)全家桶,這篇文章主要介紹了SpringCloud學(xué)習(xí)筆記(一)搭建父工程,需要的朋友可以參考下2021-10-10
struts2中通過(guò)json傳值解決亂碼問(wèn)題的實(shí)現(xiàn)方法
這篇文章主要介紹了struts2中通過(guò)json傳值解決亂碼問(wèn)題的實(shí)現(xiàn)方法,涉及js編碼及java解碼的相關(guān)操作技巧,需要的朋友可以參考下2016-06-06
eclipse自動(dòng)創(chuàng)建SpringBoot項(xiàng)目報(bào)錯(cuò)的解決
這篇文章主要介紹了eclipse自動(dòng)創(chuàng)建SpringBoot項(xiàng)目報(bào)錯(cuò)的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
實(shí)例講解Java并發(fā)編程之ThreadLocal類
這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之ThreadLocal類,本文給出了模擬ThreadLocal、實(shí)用ThreadLocal等代碼實(shí)例,需要的朋友可以參考下2015-04-04
在eclipse導(dǎo)入Java的jar包的方法JDBC(圖文說(shuō)明)
這篇文章主要介紹了在eclipse導(dǎo)入Java 的jar包的方法 JDBC 圖文說(shuō)明 ,需要的朋友可以參考下2015-09-09

