基本概念
首先我們要知道,一個程式在運行程序中可能會遇到程式終止的情況,一般這種情況可以分成兩大類
一類是可以處理,非致命性的,正確處理之后程式可以進行,就是我們說的 例外
另一類是不能進行簡單的恢復執行,程式遇到了嚴重的不正常情況,是致命性的,稱之為 錯誤 , 包括 虛擬機錯誤,動態連接失敗等
例外 按照性質,又分為 編譯時例外 跟 運行時例外
編譯時例外,程式正確,外部條件不滿足引發的例外,源代碼(.java檔案)編譯成位元組碼(.class檔案)編譯不通過
運行時例外,程式錯誤,程式存在bug, 比如我們常見的
陣列角標越界例外 java.lang.ArrayIndexOutOfBoundsException(就是定義了一個只能存5個元素的陣列,結果存了6個)
還有就是空指標例外 java.lang.NullPointerException 等等

例外處理
在java 中 ,處理例外主要有兩種方式
-
一種是交由java 預設處理機制,(簡單來說就是往上拋 ) 用關鍵字throws
這種方法有點賤了,就是我發現這邊有例外,我不去處理,我標記一下,往上拋,等你呼叫我的時候,你再去處理這個例外
public static int throwMyException() throws ArithmeticException {
return 0;
}
-
另一種方法就是 將例外進行捕獲,自己拉的屎自己處理干凈 ,別人呼叫你時就不用再處理例外
捕獲例外使用 try和catch 關鍵字 ,try/catch 代碼塊放在例外可能出現的地方
try{
int[] array = new int[2];
System.out.println("獲取角標為的元素 :" + array[3]);
}catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
System.out.println("Exception thrown :" + e);
System.out.println("陣列角標越界了!!!");
}
}
列印結果:

可以看出,當try 里面程式出現例外時,執行catch里面的代碼,將例外進行捕獲
捕獲例外時,還有一個關鍵字finally ,指的是,不論程式是否發生例外,都會執行finally里面的代碼塊,例如:
try{
int[] array = new int[2];
System.out.println("獲取角標的元素 :" + array[3]);
}catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
System.out.println("Exception thrown :" + e);
System.out.println("陣列角標越界了!!!");
} finally {
System.out.println("程式發生例外,我是一定會執行的方法");
}

再看未發生例外的情況
try{
int[] array = new int[2];
System.out.println("獲取角標的元素 :" + array[1]);
}catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
System.out.println("Exception thrown :" + e);
System.out.println("陣列角標越界了!!!");
} finally {
System.out.println("程式沒有發生例外,我是一定會執行的方法");
}
列印結果:

因為陣列里面沒有資料,整形默認值為 0
自定義例外
先說說為什么要自定義例外 ?
自定義例外 能更加直觀地回傳錯誤資料給前端,便于統一進行處理,話不多說,直接來看實作程序,記得收藏,后續業務需求 ,作業中 100% 可以用到
首先撰寫一個 封裝API的錯誤碼
/**
* 封裝API的錯誤碼
* @author: xrp
*/
public interface IErrorCode {
/** getCode
* @return long
*/
long getCode();
/** getMessage
* @return String
*/
String getMessage();
}
最后寫一個全域例外處理器 GlobalExceptionHandler
/**
* @author xrp
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(value = https://www.cnblogs.com/zeroll/archive/2022/12/22/ApiException.class)
public ResponseMessage
ResultUtils 為回傳前端構造工具 ,一般公司會同一封裝
使用斷言
package com.common.utils.securityutils;
/**
*
* @author xrp
*/
public class Asserts {
public static void fail(String message) {
throw new ApiException(message);
}
public static void fail(IErrorCode errorCode) {
throw new ApiException(errorCode);
}
}
接下來我們就可以使用了,例如
if(!xxxxx) {
Asserts.fail("CRON運算式不正確")
}
以上便是本期 java例外全部內容了

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540506.html
標籤:其他
上一篇:教你用Java實作動態調色板
下一篇:注解
