程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 異常詳解

Java 異常詳解

編輯:關於JAVA

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雖好用,但是假如是濫用,這樣只是會讓順序的可讀性變的很蹩腳,當順序報錯,就無法疾速精確的定位了。

以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved