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

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

簡單來說:
編譯時異常就是在編譯的時候出現(xiàn)的異常,
運行時異常就是在運行時出現(xiàn)的異常。
常見運行時異常
運行時異常;
直接繼承自RuntimeException或者其子類,編譯階段不會報錯,運行時可能出現(xiàn)的錯誤。
常見的運行時異常示例:
數(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,直接輸出沒有問題,但是調(diào)用空指針的變量的功能就會報錯。
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ù)學操作異常:ArithmeticException
public static void main(String[] args) {
int c = 20 / 0; // 數(shù)學異常, 分母不能為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è)務(wù)沒有考慮好或者是編程邏輯不嚴謹引起的程序錯誤,自己水平問題
常見編譯時異常
編譯時異常:
不是RuntimeException或者其子類的異常,編譯階段就報錯(代碼寫出來就報錯),必須處理,否則代碼不通過
編譯時異常示例:

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

