coreJava_12——異常
/*
承認差距,沉心靜氣……
(筆者最近就要找工作了,java的框架之類的還沒學好,最近可能更的不及時。忙完這陣子我會再系統的整理一下這個coreJava系列,以及一些再面試和專案中的經驗跟大家分享)
*/
簡書現在竟然要求繫結微信才可以發表,考慮換地方了
一、理解異常
1、所有異常類的祖先類為java.lang.Throwable類。它有兩個直接的子類:
- 1、Error類:表示表示僅靠程式本身無法恢復的嚴重錯誤,比如記憶體溢位。
- 2、Exception類:表示程式本身無法處理的異常。又分為執行時異常和編譯時異常。
- a.執行時異常:RuntimeException類及其子類都被稱為執行時異常,這種異常的特點是Java編譯器不會檢查它,也就是說,當程式中 可能出現這類異常時,即使沒有用try...catch語句捕獲它,也沒有用throws子句宣告丟擲它,還是會編譯通過。JVM預設會將異常的名稱、原因等問題輸出在控制檯,但同時程式中止執行。
執行時異常主要是由於程式碼不嚴謹造成,需要修改程式碼。在程式除錯階段,遇到這種異常時,正確的做法是改程式序的設計和實現方式,修改程式中的錯誤,從而避免這種異常。捕獲它並且使程式恢復執行並不是明智的辦法。 - b、編譯時異常:必須進行處理的,若不處理無法通過編譯。不是RuntimeException的異常都是編譯時異常。當程式中可能出現這類異常時,要麼用try...catch語句捕獲它,要麼用throws子句宣告丟擲它,否則編譯不會通過。一些常見執行時異常RuntimeException
1.java.lang.ArithmeticException 算術異常如:除0;
2.java.lang.NullPointerException空指標引用 如:沒初始化一個References便使用; 3.java.lang.ArrayIndexoutofBoundsException
陣列越界 如:呼叫一個有十個元素的Array的第十一個元素的內容 4.java.lang.ClassCastException 強制型別轉換異常
5.java.lang.NumberFormatException
資料格式異常 如:Integer.parseInt("a");
6.java.lang.NegativeArraySizeException 陣列長度為負數異常
- a.執行時異常:RuntimeException類及其子類都被稱為執行時異常,這種異常的特點是Java編譯器不會檢查它,也就是說,當程式中 可能出現這類異常時,即使沒有用try...catch語句捕獲它,也沒有用throws子句宣告丟擲它,還是會編譯通過。JVM預設會將異常的名稱、原因等問題輸出在控制檯,但同時程式中止執行。
2、通過例子可以更好的理解
某天天氣很好,小明騎車去山裡遊玩
- 問題1:山路塌陷了,小明及時停住,但是無法通過了。(嚴重問題Error)
- 問題2:小明出門推自行車,發現輪胎沒氣了。小明,重新打好氣。(執行期就應該檢查問題並處理)
- 問題3:小明騎車在路上行駛著,山路兩邊有石子,但是中間時平坦的;
一直在平坦的路上時沒有問題的,但是小明偏喜歡騎到石子上,結果爆胎,出現問題。
3、異常宣告和處理——try...catch
--格式:
try{
可能出現問題的程式碼
}catch(異常名 變數名){
針對問題的處理
}
catch(異常名 變數名){
針對問題的處理
}
1.自己主動使用throw語句的時候程式碼會丟擲異常;
-
2.使用try-catch-finally語句結構處理或
在方法宣告上宣告throws繼續丟擲;
(注意:a、try中的語句越少越好 b、catch中必須有內容,用於處理以及提示等。)異常處理語句的語法規則:
1.try程式碼塊不能脫離catch程式碼塊或finally程式碼塊而單獨存在。try程式碼塊後面至少有一個catch程式碼塊或finally程式碼塊。
2.try程式碼塊後面可以有零個或多個catch程式碼塊,還可以有零個或至多一個finally程式碼塊。如果catch程式碼塊和finally程式碼塊並存,finally程式碼塊必須在catch程式碼塊後面。
3.try程式碼塊後面可以只跟finally程式碼塊。
4.在try程式碼塊中定義的變數的作用域為try程式碼塊,在catch程式碼塊和finally程式碼塊中不能訪問該變數。
5.可以有多個catch語句時,注意一但try中出現問題,將會與後邊的catch裡的問題進行匹配,一旦有符合的,則執行該catch裡的處理語句,並結束當前try...catch,繼續執行後邊的程式。
(注意:catch中的異常為平級,那麼先後順序不影響,只匹配符合的,但是若時子父關係,那麼,父必須放在後邊,否則,匹配到父後,即不再匹配後邊其他的catch語句)
6.如果一個方法可能出現編譯異常,要麼用try...catch語句捕獲,要麼用throws子句宣告將它丟擲。
7.throw語句後面不允許緊跟其它語句,因為這些語句永遠不會被執行。
4、異常宣告和處理——throws和throw
- 1、throws
定義功能方法時,需要把出現的問題暴露出來讓呼叫者處理,那麼就通過throws在方法上標識。
格式:
method() throws 異常名1,異常名2...
編譯期間異常丟擲,將來呼叫必須處理,不 處理無法通過編譯;
執行時異常丟擲,將來呼叫可以不處理。 - 2、throw
在功能方法內部出現某種情況,程式不能執行,需要進行跳轉時,就要用throw丟擲異常的物件(注意不是異常名)
5、throws與throw區別(面試中常見):
throws
- 用在方法宣告後面,跟的是異常類名
- 可以跟多個異常類名,用逗號隔開
- 表示丟擲異常,有該方法的呼叫者來處理
- throws表示出現異常的一種可能性,並不一定會發生這些異常
throw
- 用在方法體內,跟的是異常物件名
- 只能丟擲一個異常物件名
- 表示丟擲異常,由方法體內的語句處理
- throw是丟擲了異常,執行throw一定是丟擲某種異常
例:
public class ExceptionDemo1 {
public static void main(String[] args) {
ExceptionDemo1 ed = new ExceptionDemo1();
try {
ed.method2();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("已處理異常...");
}
}
public void method2() throws Exception { //throws是用在方法宣告後邊
int a = 10;
int b = 0;
if (b == 0) {
// throw ArithmeticException; //錯誤寫法,throw丟擲的不是名稱
throw new Exception();// 丟擲異常物件
} else {
System.out.println(a / b);
}
}
}
5、異常處理原則
如果該功能內部可以將問題處理,用try,如果處理不了,交由呼叫者處理,這時用throws。
區別:後續程式需要繼續執行,就用try;反之,則用throws。
6、finally
- 1、finally的特點
- finally的語句塊一定執行
- 特殊情況,在執行到finally之前JVM已經退出(比如System.exit(0))
- 2、finally的作用
- 用於釋放資源,在IO操作和資料庫中會見到
- 3、finally相關的面試題
- 1、final,finally和finalize的區別
- final:最終的意思,可以修飾類(時,類不能被繼承)、成員變數(時,變數就是常量)、成員方法(時,方法不能被重寫)。
- finally:是異常處理的一部分用於釋放資源。一般情況,程式碼肯定會執行,特殊情況,在執行到finally之前jvm就退出的話將不執行。
- finalize:是Object類的一個方法,用於垃圾回收。
- 2、如果catch裡面有return語句,請問finally的程式碼還會執行嗎?如果會,請問是在return前還是後?
- 會執行,在return前。
- 準確的說,在中間。
- 會執行,在return前。
- 1、final,finally和finalize的區別
public class FinallyDemo2 {
private static int a=0;
public static void main(String[] args) {
System.out.println(TestTheReturn());//輸出30
System.out.println("the current value of a is: "+ a);//輸出40
}
public static int TestTheReturn() {
a = 10;
try {
System.out.println(a/0);
a = 20;
} catch (ArithmeticException e) {
a = 30;
return a;//#1
//return a執行到這裡,不是return a了,而是return 30,這個返回路徑已經形成
//但是發現後邊還有finally語句,因此執行finally語句的內容,a=40,
//返回到原來的路徑,繼續執行return 30。
}finally {
a = 40;
//return a; //#2
}
return a;//與#2處的return不能同時存在,跟該語句地位相同,衝突。
//對#1處而言,已經有返回了;所以此處return語句並不執行
}
}
7、自定義異常
有些異常,Java中沒有對應的異常,需要我們自定義來進行相關的異常處理。如,檢查使用者輸入是否符合要求等。
自定義異常分為兩種
繼承自Exception 編譯時異常——編譯要檢查
-
繼承自RuntimeException 執行時異常——編譯不需要檢查
1、
下面給出三個類:
//自定義異常類
package exception;
//也可以是繼承自RuntimeException
//public class MyException extends RuntimeException
public class MyException extends Exception{
//提供構造方法,用於逐層向上傳遞提示資訊,message
//可通過檢視api參考寫法。
public MyException() {
}
public MyException(String message) {
super(message);
}
}
//檢查異常類
package exception;
public class Teacher {
public void check(int score) throws MyException {
if (score > 100 || score < 0) {
throw new MyException("分數必須在0——100之間");
}else {
System.out.println("分數沒有問題");
}
}
}
//測試類
package exception;
import java.util.Scanner;
public class Student {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入成績:");
int score = scanner.nextInt();
Teacher t = new Teacher();
try {
t.check(score);
} catch (MyException e) {
e.printStackTrace();
}
}
}
8、小結一下
異常的注意事項
- 子類重寫父類方法時,子類的方法必須丟擲相同的異常或者弗雷異常的子類。
- 如果父類丟擲了多個異常,子類重寫父類時,只能丟擲相同的異常或者時他的子類,子類不能丟擲父類沒有的異常。
- 如果被重寫的方法沒有異常丟擲,那麼子類的方法絕對不可以丟擲異常,如果子類的方法內有異常發生,那麼子類就只能try,不能throws
相關文章
- 異常篇——異常處理
- 異常和異常呼叫鏈
- Java 異常(二) 自定義異常Java
- Java checked異常和unchecked異常。Java
- 異常-編譯期異常和執行期異常的區別編譯
- 異常-throws的方式處理異常
- 異常處理與異常函式函式
- jmu-Java-06異常-01-常見異常Java
- hibernate異常之--count查詢異常
- Java 異常表與異常處理原理Java
- restframework 異常處理及自定義異常RESTFramework
- oracle 異常Oracle
- OutOfMemoryError異常Error
- Java異常Java
- 異常(Exception)Exception
- Java 異常Java
- 異常JavaJava
- 【java】異常Java
- java 異常Java
- Flutter 常見異常分析Flutter
- Java 異常(一) 異常概述及其架構Java架構
- MVC使用異常過濾器處理異常MVC過濾器
- 儲存過程——異常捕獲&列印異常資訊儲存過程
- C#規範整理·異常與自定義異常C#
- 異常-try...catch的方式處理異常1
- 異常-try...catch的方式處理異常2
- 異常-自定義異常的實現和測試
- python自定義異常,使用raise引發異常PythonAI
- C#自定義異常 統一異常處理C#
- MySQL定義異常和異常處理詳解MySql
- [jvm]常見的oom異常JVMOOM
- Sanic Exception – 異常Exception
- 自定義異常
- OutOfMemoryException異常解析Exception
- CollectionView 的異常View
- Kotlin 異常Kotlin
- JavaScript_異常JavaScript
- java之異常Java