一.認識異常
在Java中,我們將程序執(zhí)行過程中發(fā)生不正常的情況稱為異常。
我們先看下面這行代碼,我們將字符串賦值給了字符類型的s,由我們所學(xué)習(xí)的知識來判斷,這肯定是不能通過的。
char s = "adas";
接下來我們來簡單了解幾種異常:
1.算數(shù)異常
2.數(shù)組越界異常
int[] arr = new int[]{1,2,3};
System.out.println(arr[5]);
3.空指針異常
int[] str = null;
System.out.println(str.length);
二.異常分類
由圖可以看出
1.Throwable是所有異常體系的頂層類,由它延伸出兩個重要的子類Error和Exception
2.Error是指Java虛擬機無法處理的嚴重問題,比如JVM的內(nèi)部錯誤,資源耗盡等,代表的錯誤有StackOverflowError和OutOfMemoryError。
3.Exception是在程序運行發(fā)現(xiàn)猴程序員可以自己解決的異常,比如感冒,發(fā)燒。我們平時所說的異常就是Exception。
三.異常的分類
1.編譯時異常
編譯時異常也叫做受檢查異常,是指程序在編譯時就出現(xiàn)的錯誤。
舉例如下
我們將3.66浮點型數(shù)字賦值給int型的變量a,這時編譯器就會報錯,我們這時根據(jù)編譯器報的提示就可以修改錯誤。
2.運行時異常
在程序運行時報的錯誤,叫做運行時異常,也叫非受檢查異常。
RunTimeException以及其子類對應(yīng)的異常,都稱為運行時異常。比如:NullPointerException、ArrayIndexOutOfBoundsException,ArithmeticException。
四.異常的處理
那么我們發(fā)現(xiàn)異常后,我們就需要解決異常,這里有兩種處理異常的方法
1.LYBL:事前防御型
Look Before You Leap。顧名思義,這就是在操作之前就做好充分的檢查。
boolean ret =false;
ret = 進入系統(tǒng)();
if(!ret){
進入系統(tǒng)錯誤!;
return;
}
ret = 輸入賬號();
if(!ret){
賬號錯誤!;
return;
}
ret = 輸入密碼();
if(!ret){
密碼錯誤!;
return;
}
ret = 操作選擇();
if(!ret){
輸入操作錯誤!;
return;
}
這樣的代碼將操作和異常的拋出混合在一起,使代碼看起來十分混亂,想要找到某一個操作還需要一個一個瀏覽。所有我們一般不使用這種異常處理方法.
2.EAFP:事后認錯型
It’s Easier To ASk Forgiveness Than Permission ?!笆潞螳@取原諒比事前獲取許可更容易”. 也就是先操作, 遇到問題再處理
boolean ret =false;
try{
ret = 進入系統(tǒng)();
ret = 輸入賬號();
ret = 輸入密碼();
ret = 操作選擇();
}catch(進入系統(tǒng)錯誤){
處理進入系統(tǒng)錯誤;
}catch(輸入賬號錯誤){
處理輸入賬號錯誤;
}catch(輸入密碼錯誤){
處理輸入密碼錯誤;
}catch(操作選擇錯誤){
處理操作選擇錯誤;
}
這樣正確流程和錯誤流程是分開的,程序更關(guān)注正常流程。使得代碼更加清晰,更加容易理解,在日常中,處理代碼異常的核心思想就是EAFP;
在Java中,處理異常的五個關(guān)鍵字:throw、try、catch、final、throws。
五.異常的拋出
Throw
可以通過throw程序員來自己拋出應(yīng)該異常
public class Main {
public static void func(int[] arry){
if(arry == null){
throw new NullPointerException();
}
}
public static void main(String[] args) {
func(null);
}
}
同一時刻,只會拋出一個異常。
注意事項
- throw必須寫在方法體內(nèi)部
- 拋出的對象必須是Exception 或者 Exception 的子類對象
- 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理
- 如果拋出的是編譯時異常,用戶必須處理,否則無法通過編譯
- 異常一旦拋出,其后的代碼就不會執(zhí)行
六.異常的捕獲
1.異常的捕獲
異常的捕獲,也就是異常的具體處理方式,主要有兩種:異常聲明throws 以及 try-catch捕獲處理
2.異常聲明throws
處在方法聲明時參數(shù)列表之后,當(dāng)方法中拋出編譯時異常,用戶不想處理該異常,此時就可以借助throws將異常拋給方法的調(diào)用者來處理。即當(dāng)前方法不處理異常,提醒方法的調(diào)用者處理異常。
語法格式:
修飾符 返回值類型 方法名(參數(shù)列表) throws 異常類型1,異常類型2...{
}
提醒程序員這里可能會拋出異常,
如果程序員不處理異常,則就會交給JVM來處理,此時程序就會異常終止。
當(dāng)拋出異常時,程序不會繼續(xù)向下運行。
3.try-catch捕獲并處理
注意
- []中表示可選項,可以添加,也可以不用添加
- try中的代碼可能會拋出異常,也可能不會
舉例
這里再main方法中也進行了聲明,程序編譯上,不會報錯,但是這個異常程序員也沒有處理,這時就會交給JVM來處理,就出現(xiàn)如下情況。
如果main方法中沒有聲明
此時使用try-catch來處理(alt+回車)
try
{里面放可能出現(xiàn)異常的代碼}
catch(里面放要捕獲異常的類型)
{}
此時運行結(jié)果沒有異常報錯的提示,如果我們要顯示出來使用e.printStackTrace()
當(dāng)catch沒有捕獲到異常時,就會交給JVM來處理,程序就會異常終止!
七.自定義異常
如果繼承Exception就是受查異常/編譯異常,在程序未運行時,就能發(fā)現(xiàn)錯誤
如果繼承RunTimeException 就是非受查異常/運行時異常,只有在程序運行時才會報錯。
并且自定義異常需要重寫方法,跟情況而定!
如下是博主分享的一個自定義異常的例子:
我們的目的是在用戶輸入賬號名稱和密碼時,判斷跟所存的密碼賬號是否一致,如果不相同,則報錯文章來源:http://www.zghlxwxcb.cn/news/detail-765001.html
public class PasswordException extends RuntimeException{
public PasswordException() {
}
public PasswordException(String message) {
super(message);
}
}
public class UserNameException extends RuntimeException{
public UserNameException() {
}
public UserNameException(String message) {
super(message);
}
}
package Myerror;
import test.PassWordException;
public class Login {
public String userName = "xiaoguo";
public String password = "henshuai";
public void Login(String userName,String password){
if(!this.userName.equals(userName)){
throw new UserNameException("用戶名錯誤");
}
if(!this.password.equals(password)){
throw new PassWordException("密碼錯誤!");
}
}
}
public class Main {
public static void main(String[] args) {
try {
Login login = new Login();
login.Login("xiaohuang","bushuai");
}catch (UserNameException e){
e.printStackTrace();
System.out.println("處理用戶名錯誤!");;
}catch (PasswordException e){
e.printStackTrace();
System.out.println(" 處理密碼錯誤!");;
}
}
}
碼字不易,感謝觀看
如果對你有幫助的話,記得點贊??評論+關(guān)注吧文章來源地址http://www.zghlxwxcb.cn/news/detail-765001.html
到了這里,關(guān)于Java中的異常你了解多少?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!