Java 異常詳解。本站提示廣大學習愛好者:(Java 異常詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 異常詳解正文
一.異常與錯誤的區別
再講異常之前我們就應該要知道異常和錯誤的區別
Error類和Exception類的父類都是throwable類,他們的區別是:
Error類普通是指與虛擬機相關的問題,如零碎解體,虛擬機錯誤,內存空間缺乏,辦法調用棧溢等。關於這類錯誤的招致的使用順序中綴,
僅靠順序自身無法恢復和和預防,遇到這樣的錯誤,建議讓順序終止。
Exception類表示順序可以處置的異常,可以捕捉且能夠恢復。遇到這類異常,應該盡能夠處置異常,使順序恢復運轉,而不應該隨意終止異常。
二.異常的表現分類:
1.checked 異常反省期異常 java.lang.Excetion 在編譯期需求人工處置否則編譯失敗:Exception的子類除了運轉期異常都是反省期異常
2.非Checked異常運轉時異常 java.lang.RuntimeException 不需求處置的直接能編譯經過:一切的RuntimeException以及其子類都是運轉異常

舉例:運轉期異常

後果:運轉期異常,當你敲好代碼時不會報錯,而當你運轉時才會報除數不能為0的錯誤
舉例:反省期異常:

後果:反省期異常,當你編譯的時分就會報錯,一定要拋出異常編譯才干經過
三.異常的處置機制
Java言語次要依賴於 try catch finally 和throws throw 五個關鍵字來描繪異常
1) 在發作異常的中央直接處置
運用try catch finally 直接處置異常
a) try-catch-finally構造中try塊是必需有的,catch和finally塊為可選,但兩者至多必需呈現其中之一。
b) catch 可以同時呈現多個,但一個異常最多捕捉一個catch,而且catch的順序是從上往下
c) finally 無論能否捕捉異常都會執行的一行代碼
演示1:try異常
public class TestException {
public static void main(String[] args) {
int c = 0;
try
{
int a = 3;
int b = 0;
// 這塊代碼呈現了異常
c = a / b;
// 那麼異常之後的代碼都不會被執行
System.out.println("Hello World");
}
catch (ArithmeticException e)
{
System.out.println("除數不能為零");
}
finally
{
//不論有沒有發作異常,finally語句塊都會被執行
System.out.println("Welcome");
}
System.out.println(c);
// 當b為0時,有異常,輸入為c的初始值0
}
}
//輸入後果:除數不能為零 Welcome 0
try異常
演示2:帶有return的異常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class DemoException {
public static void main(String[] args) {
int a=test3();
System.out.println(a);
}
@SuppressWarnings("finally")
public static int test3(){
try {
System.out.println(9 / 0);
return 1;
} catch (Exception e) {
System.out.println("捕捉到了異常....");
return 2;
}finally{
System.out.println("無論如何都會執行的代碼...");
return 3;
}
}
}
//輸入後果 "呵呵""哈哈" 3
帶有return異常
得出結論:作用范圍 return 終止整個辦法體,但在finally呈現之前 return是老大 finally 作用范圍> return
2)將異常拋給調用者讓調用者處置
//throws在辦法體頭部經過聲明 拋出異常...
public void dealFile() throws FileNotFoundException{
FileInputStream fis =new FileInputStream("C:/name.txt");
}
//那麼那麼下面調用這個辦法可以選擇是持續拋出,還是捕捉異常
案例一:經過throws拋出異常,調用者直接捕捉拋出的異常
public class TestException {
public static void main(String[] args) {
try {
Test3(); //這裡選擇直接捕捉異常,而不是在拋出異常
} catch (NumberFormatException e) {
System.err.println("非數據類型不能轉換。");
} //System.err.println();這種輸入方式可以輸入錯誤的音訊,在控制台出現白色。
}
public static void Test3() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
}
}
throws異常
運轉後果:
非數據類型不能轉換。
留意:運用Throws是的限制
兩小准繩
運用throws 聲明拋出異常一個限制
子類承繼父類重寫父類的辦法
子類拋出的異常必需比父類少
子類拋出的異常必需比父類小
兩小准繩是針對反省期異常的,運轉期異常不遵照這個規則(RuntimeException 以及子類)
案例二:經過throw拋出異常
public class TestException {
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException("不能相等");
} else {
System.out.println(s);
}
}
}
throw異常
運轉後果如下:

面試題:Throw 和Throws有什麼區別?
Throw語句是用在辦法體內表示拋出的異常由辦法體內的語句處置
Throws 語句是在辦法聲明之後拋出異常表示在拋出的異常交給調用者處置
Throws 要麼運用try –catch –finally 處置要麼持續拋出
四.自定義異常
所謂自定義異常,通常就是定義一個類,去承繼Exception類或許它的子類。由於異常必需直接或許直接地承繼自Exception類。
通常狀況下,會直接承繼自Exception類,普通不會承繼某個運轉時的異常類。
自定義異常可以用於處置用戶登錄錯誤,用戶輸出錯誤提示等。
自定義異常需求遵照以下步驟
承繼RuntimeExcetion 或許Exception 寫一個無參的結構函數 寫一個String類型的結構函數舉例:自定義異常:
public class MyException extends Exception
{
public MyException()
{
super();
}
public MyException(String message)
{
super(message);
}
}
一種處置異常方式
public class ExceptionTest4
{
public void method(String str) throws MyException
{
if(null == str)
{
throw new MyException("傳入的字符串參數不能為null!");
}
else
{
System.out.println(str);
}
}
public static void main(String[] args) throws MyException //異常處置方式1,不時向外拋出
{
ExceptionTest4 test = new ExceptionTest4();
test.method(null);
}
}
另一種異常處置方式:
public class ExceptionTest4
{
public void method(String str) throws MyException
{
if (null == str)
{
throw new MyException("傳入的字符串參數不能為null!");
}
else
{
System.out.println(str);
}
}
public static void main(String[] args)
{
//異常處置方式2,采用try...catch語句
try
{
ExceptionTest4 test = new ExceptionTest4();
test.method(null);
}
catch (MyException e)
{
e.printStackTrace();
}
finally
{
System.out.println("順序處置終了");
}
}
}
最後說一句,try-catch-finally雖好用,但是假如是濫用,這樣只是會讓順序的可讀性變的很蹩腳,當順序報錯,就無法疾速精確的定位了。
以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!