Java十分鐘精通異常處理機(jī)制
一、什么是異常
異常機(jī)制:
異常機(jī)制是指當(dāng)程序出現(xiàn)錯誤后,程序如何處理。具體來說就是程序發(fā)生異常,異常機(jī)制提供程序的退出安全通道。
通俗來說:就是為了讓程序繼續(xù)執(zhí)行下去,不至于中斷。
程序錯誤:
程序錯誤分為三種:
1.編譯錯誤
2.運(yùn)行時錯誤
3.邏輯錯誤。
(1)編譯錯誤:因?yàn)槌绦驔]有遵循語法規(guī)則,編譯程序能夠自己發(fā)現(xiàn)并提示我們的錯誤的原因和位置。
(2)運(yùn)行時錯誤:因?yàn)槌绦蛟趫?zhí)行時,運(yùn)行環(huán)境發(fā)現(xiàn)了不能執(zhí)行的操作。
(3)邏輯錯誤:因?yàn)槌绦驔]有按照預(yù)期的邏輯順序執(zhí)行。
異常就是指程序運(yùn)行時發(fā)生錯誤,而異常處理就是對這些錯誤進(jìn)行處理和控制。
編譯錯誤如下:

運(yùn)行錯誤如下:

算數(shù)異常報錯:

二、異常的結(jié)構(gòu)圖

常見異常:
| 序號 | 異常名稱 | 異常描述 |
|---|---|---|
| 1 | java.lang.NullPointerException | 空指針異常:對象為空,并且調(diào)用相應(yīng)方法。 |
| 2 | java.lang.ClassNotFoundException | 找不到指定類 |
| 3 | java.lang.ArrayIndexOutOfBoundsException | 數(shù)組下標(biāo)越界 |
| 4 | java.lang.NumberFormatException | 數(shù)字格式化異常 |
| 5 | java.lang.ArithmeticException | 數(shù)學(xué)運(yùn)算異常 |
| 6 | java.lang.StackOverflowError | 內(nèi)存空間溢出錯誤,方法遞歸調(diào)用中,經(jīng)常發(fā)生 |
| 7 | java.lang.ClassCastException | 類型轉(zhuǎn)換異常,向下轉(zhuǎn)型中經(jīng)常發(fā)生 |
| 8 | java.text.ParseException | 時間格式化異常,SimpleDateFormart中經(jīng)常發(fā)生 |
| 9 | java.util.InputMismatchException | 輸入類型不匹配異常 |
三、捕獲異常
虛擬機(jī)對異常的兩種處理方式:
- 捕獲異常
- 拋出異常
捕獲異常
try - catch - finally
- try:嘗試著執(zhí)行可能會出現(xiàn)異常的代碼
- catch:如果try中的代碼在執(zhí)行過程中,出現(xiàn)了異常,捕獲該異常,如果沒有異常,就不執(zhí)行。
- finaliy:其中的代碼塊是不管報不報錯都會執(zhí)行的,通常用來釋放資源。
try{
//可能會出錯的代碼塊
}catch(){
//出現(xiàn)異常后,執(zhí)行的語句
}finally{
//通常用來釋放資源
}
四、聲明和拋出異常
1.使用throws聲明異常
? 運(yùn)用于方法聲明之上,用于表示當(dāng)前方法不處理異常,而是提醒該方法的調(diào)用者來處理異常
public void fun1() throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2020-10-12");
}
2.使用throw拋出異常
? throw用在方法內(nèi),用來拋出一個異常對象,將這個異常對象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。
public void fun2() {
throw new NullPointerException("空指針異常");
System.out.println("hello world");//會報紅,提示unreachable statement,該語句不可能被執(zhí)行
}
案例:
1、嵌套try-catch
@Test
public void fun2() {
try {
throw new Exception("非運(yùn)行時異常,哈哈哈");
} catch (Exception e) {
e.printStackTrace();
try {
throw new ParseException("解析異常,哈哈哈",0);
} catch (Exception ex) {
ex.printStackTrace();
}
}finally {
try {
throw new TimeoutException("超時異常,哈哈哈");
} catch (TimeoutException e) {
e.printStackTrace();
try {
throw new SQLException("SQL異常");
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
2、代替返回語句
public int funR1(){
try {
return 1;
}catch (Exception e){
throw new RuntimeException();
}
}
public int funR2(){
if(true) {
return 1;
}else{
throw new RuntimeException();
}
}
五、自定義異常
自定義異常,通常就是定義了一個繼承自Exception類的子類,那么這個類就是一個自定義異常類。通常情況下,我們都會直接繼承自Exception,一般不會繼承某個運(yùn)行時異常類。
案例如下:
public class HeroNotExistException extends RuntimeException {
private String m;
public String getM() {
return m;
}
public void setM(String m) {
this.m = m;
}
//兩個參數(shù)的有參構(gòu)造,一個傳遞給父類Throwable,一個自己用
public HeroNotExistException(String message, String m){
super(message);
this.m=m;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("請輸入您最欣賞的歷史人物:");
String name = sc.next();
if(name.equals("孫悟空")){
try{
throw new HeroNotExistException("英雄人物不存在","哈哈");
}catch (HeroNotExistException e){
e.printStackTrace();
System.out.println(e.getM());
}
}
}
}
到此這篇關(guān)于Java十分鐘精通異常處理機(jī)制的文章就介紹到這了,更多相關(guān)Java 異常處理機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟
這篇文章主要介紹了SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟,使用注解關(guān)閉Swagger2,避免接口重復(fù)暴露,非常具有實(shí)用價值,需要的朋友可以參考下2018-12-12
關(guān)于ApplicationContext的啟動流程詳解
ApplicationContext是Spring框架中用于管理和配置Bean的核心接口,它的啟動流程包括準(zhǔn)備刷新、獲取BeanFactory、準(zhǔn)備BeanFactory、后置處理BeanFactory、調(diào)用BeanFactoryPostProcessor、注冊BeanPostProcessor2025-03-03
SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的切換實(shí)踐
這篇主要介紹了SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的切換,本文基于AOP來實(shí)現(xiàn)數(shù)據(jù)源的切換,文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-03-03
Spring Boot @Conditional注解使用示例詳解
在SpringBoot中,@Conditional注解用于條件性地注冊bean,根據(jù)某些條件決定是否創(chuàng)建特定bean,可以實(shí)現(xiàn)Condition接口并重寫matches方法來定義條件,本文介紹Spring Boot @Conditional注解的相關(guān)知識,感興趣的朋友一起看看吧2024-12-12
Spring Boot 整合 TKMybatis 二次簡化持久層代碼的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot 整合 TKMybatis 二次簡化持久層代碼的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream
這篇文章主要為大家詳細(xì)介紹了解Java8中的Lambda,函數(shù)式接口和Stream的用法和原理,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08

