帶你全面認(rèn)識Java中的異常處理
Java異常處理
異常體系的介紹
什么事異常處理?
異常是程序在“編譯”或者“執(zhí)行”的過程中可能出現(xiàn)的問題,比如: 數(shù)組索引越界、空指針異常、 日期格式化異常,等…
注意:語法錯(cuò)誤不算在異常體系中。
為什么要學(xué)習(xí)異常?
異常一旦出現(xiàn)了,如果沒有提前處理,程序就會退出JVM虛擬機(jī)而終止.
研究異常是為了避免異常,然后提前處理異常,體現(xiàn)的是程序的安全, 健壯性。
Error:是系統(tǒng)級別問題、JVM退出等,代碼無法控制。
Exception:java.lang包下,稱為異常類,它表示程序本身可以處理的問題
RuntimeException及其子類:統(tǒng)稱為運(yùn)行時(shí)異常,編譯階段不會報(bào)錯(cuò)。 (空指針異常,數(shù)組索引越界異常)除RuntimeException之外所有的異常:統(tǒng)稱為編譯時(shí)異常,編譯期必須處理的,否則程序不能通過編譯。 (日期格式化異常)。
編譯時(shí)異常和運(yùn)行時(shí)異常:
簡單來說:
編譯時(shí)異常就是在編譯的時(shí)候出現(xiàn)的異常,
運(yùn)行時(shí)異常就是在運(yùn)行時(shí)出現(xiàn)的異常。
常見運(yùn)行時(shí)異常
運(yùn)行時(shí)異常;
直接繼承自RuntimeException或者其子類,編譯階段不會報(bào)錯(cuò),運(yùn)行時(shí)可能出現(xiàn)的錯(cuò)誤。
常見的運(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,直接輸出沒有問題,但是調(diào)用空指針的變量的功能就會報(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ù)沒有考慮好或者是編程邏輯不嚴(yán)謹(jǐn)引起的程序錯(cuò)誤,自己水平問題
常見編譯時(shí)異常
編譯時(shí)異常:
不是RuntimeException或者其子類的異常,編譯階段就報(bào)錯(cuò)(代碼寫出來就報(bào)錯(cuò)),必須處理,否則代碼不通過
編譯時(shí)異常示例:
編譯時(shí)異常的作用是什么:
是擔(dān)心程序員的技術(shù)不行,在編譯階段就爆出一個(gè)錯(cuò)誤, 目的在于提醒代碼可能有錯(cuò)誤
編譯時(shí)異常是可遇不可求, 遇到了解決即可。
補(bǔ)充:自定義異常
Java 中雖然已經(jīng)內(nèi)置了豐富的異常類, 但是我們實(shí)際場景中可能還有一些情況需要我們對異常類進(jìn)行擴(kuò)展, 創(chuàng)建符合我們實(shí)際情況的異常.
我們可以通過一個(gè)例子來說明一下:模擬用戶登錄,此時(shí)就可能拋出兩種異常,一種是用戶名錯(cuò)誤異常,一種是密碼錯(cuò)誤異常:
我們先寫出一段模擬登錄的代碼
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(); } }
定義拋出用戶名錯(cuò)誤的異常類
//定義一個(gè)用戶名異常 class NameException extends RuntimeException{ public NameException(String name){ super(name); } }
定義拋出密碼錯(cuò)誤的異常
//定義一個(gè)密碼異常 class PasswordException extends RuntimeException{ public PasswordException(String password){ super(password); } }
我們在進(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("請輸入你的用戶名"); Scanner scanner=new Scanner(System.in); String name = scanner.nextLine(); System.out.println("請輸入你的密碼"); String password = scanner.nextLine(); if (!ID.equals(name)){ throw new NameException("用戶名錯(cuò)了"); } if (!Password.equals(password)){ throw new PasswordException("密碼有誤"); } } }
通過這個(gè)例子,讓我們了解什么是自定義異常類,如何使用異常類,當(dāng)然以上代碼可以進(jìn)行優(yōu)化,可以利用設(shè)置一個(gè)login登錄函數(shù),在利用try-catch進(jìn)行捕獲異常。
總結(jié)
到此這篇關(guān)于Java中異常處理的文章就介紹到這了,更多相關(guān)Java中異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot接入輕量級分布式日志框架(GrayLog)的操作方法
這篇文章主要介紹了SpringBoot接入輕量級分布式日志框架(GrayLog)的方法,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Java通過Fork/Join優(yōu)化并行計(jì)算
這篇文章主要為大家詳細(xì)介紹了Java通過Fork、Join來優(yōu)化并行計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例
本篇文章主要介紹了Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例,詳細(xì)的介紹了通過讀取Socket的輸入流來實(shí)現(xiàn)一個(gè)文件上傳的功能,有興趣的同學(xué)可以一起了解一下2017-04-04SpringCloud學(xué)習(xí)筆記之SpringCloud搭建父工程的過程圖解
SpringCloud是分布式微服務(wù)架構(gòu)的一站式解決方案,十多種微服務(wù)架構(gòu)落地技術(shù)的集合體,俗稱微服務(wù)全家桶,這篇文章主要介紹了SpringCloud學(xué)習(xí)筆記(一)搭建父工程,需要的朋友可以參考下2021-10-10struts2中通過json傳值解決亂碼問題的實(shí)現(xiàn)方法
這篇文章主要介紹了struts2中通過json傳值解決亂碼問題的實(shí)現(xiàn)方法,涉及js編碼及java解碼的相關(guān)操作技巧,需要的朋友可以參考下2016-06-06eclipse自動(dòng)創(chuàng)建SpringBoot項(xiàng)目報(bào)錯(cuò)的解決
這篇文章主要介紹了eclipse自動(dòng)創(chuàng)建SpringBoot項(xiàng)目報(bào)錯(cuò)的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(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(圖文說明)
這篇文章主要介紹了在eclipse導(dǎo)入Java 的jar包的方法 JDBC 圖文說明 ,需要的朋友可以參考下2015-09-09