1. 程式人生 > >Java中throw和throws介紹

Java中throw和throws介紹

異常處理機制

異常處理是對可能出現的異常進行處理,以防止程式遇到異常時被卡死,處於一直等待,或死迴圈。

異常有兩個過程,一個是丟擲異常;一個是捕捉異常。

丟擲異常

丟擲異常有三種形式,一是throw,一個throws,還有一種系統自動拋異常。下面它們之間的異同。

系統自動拋異常

當程式語句出現一些邏輯錯誤、主義錯誤或型別轉換錯誤時,系統會自動丟擲異常。如:

  1. publicstaticvoid main(String[] args) {  
  2.         int a = 5, b =0;  
  3.         System.out.println(5/b);  
  4.         //function();
  5. }  
系統會自動丟擲ArithmeticException異常:

Exception in thread "main" java.lang.ArithmeticException: / by zero

at test.ExceptionTest.main(ExceptionTest.java:62)

  再如
  1. publicstaticvoid main(String[] args) {  
  2.         String s = "abc";  
  3.         System.out.println(Double.parseDouble(s));  
  4.         //function();
  5. }  
系統會自動丟擲NumberFormatException異常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)

at java.lang.Double.parseDouble(Double.java:510)

at test.ExceptionTest.main(ExceptionTest.java:62)

throw

throw是語句丟擲一個異常。
語法:throw (異常物件);
      如:  throw e;

一般會用於程式出現某種邏輯時程式設計師主動丟擲某種特定型別的異常。如:

  1. publicstaticvoid main(String[] args) {  
  2.         String s = "abc";  
  3.         if(s.equals("abc")) {  
  4.             thrownew NumberFormatException();  
  5.         } else {  
  6.             System.out.println(s);  
  7.         }  
  8.         //function();
  9. }  

會丟擲異常:

Exception in thread "main" java.lang.NumberFormatException

at test.ExceptionTest.main(ExceptionTest.java:67)



throws

throws是方法可能丟擲異常的宣告。(用在宣告方法時,表示該方法可能要丟擲異常)
語法:[(修飾符)](返回值型別)(方法名)([引數列表])[throws(異常類)]{......}
      如:      public void function() throws Exception{......}

當某個方法可能會丟擲某種異常時用於throws 宣告可能丟擲的異常,然後交給上層呼叫它的方法程式處理。如:

  1. publicstaticvoid function() throws NumberFormatException{  
  2.         String s = "abc";  
  3.         System.out.println(Double.parseDouble(s));  
  4.     }  
  5.     publicstaticvoid main(String[] args) {  
  6.         try {  
  7.             function();  
  8.         } catch (NumberFormatException e) {  
  9.             System.err.println("非資料型別不能轉換。");  
  10.             //e.printStackTrace();
  11.         }  
  12. }  
處理結果如下:

非資料型別不能轉換。

throw與throws的比較

1、throws出現在方法函式頭;而throw出現在函式體。

2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是丟擲了異常,執行throw則一定丟擲了某種異常物件。

3、兩者都是消極處理異常的方式(這裡的消極並不是說這種方式不好),只是丟擲或者可能丟擲異常,但是不會由函式去處理異常,真正的處理異常由函式的上層呼叫處理。

好的程式設計習慣:

1.在寫程式時,對可能會出現異常的部分通常要用try{...}catch{...}去捕捉它並對它進行處理;

2.用try{...}catch{...}捕捉了異常之後一定要對在catch{...}中對其進行處理,那怕是最簡單的一句輸出語句,或棧輸出e.printStackTrace();

3.如果是捕捉IO輸入輸出流中的異常,一定要在try{...}catch{...}後加finally{...}把輸入輸出流關閉;

4.如果在函式體內用throw丟擲了某種異常,最好要在函式名中加throws拋異常宣告,然後交給呼叫它的上層函式進行處理。


捕捉異常

先講捕捉異常

  1. try{  
  2.  ……  
  3. }catch(Exception e){  
  4.  ……  
  5. }finally{  
  6.  ……  
  7. }  

try{……}中放置可能會發生異常的的語句塊,如可能出現異常的函式,也可以是一般的程式語句;catch(){……}用於抓住異常,(Exception e)中Exception是異常的型別,必須是Exception(Exception是所有異常類的父類)的子類。{}定義當出現異常時的處理方法。finally{……}表示不管異常是否發生,都得進行finally{}中的處理。

在捕捉異常的try{...}語句塊中,如果出現了異常,則該語句(出現異常的語句)後的程式語句都不執行,而是跳到catch{...}語句塊中執行異常的處理。如:

  1. publicstaticvoid function1() throws NumberFormatException{  
  2.         System.out.println(Double.parseDouble("abc"));  
  3.         System.out.println("第二條語句。");  
  4.     }  
  5.     publicstaticvoid main(String[] args) {  
  6.         try {  
  7.             function1();  
  8.         } catch (Exception e) {  
  9.             System.err.println(e.getMessage());  
  10.             //e.printStackTrace();
  11.         }  
  12. }  

結果如下,只輸出了一條錯誤提示語:

For input string: "abc"

System.out.println("第二條語句。");未執行。

如果一個函式沒有用throws進行拋異常,在呼叫該函式的方法也同樣可以捕捉異常。如

  1. publicstaticvoid function() {  
  2.         String s = "abc";  
  3.         System.out.println(Double.parseDouble(s));  
  4.     }  
  5.     publicstaticvoid main(String[] args) {  
  6.         try {  
  7.             function();  
  8.         } catch (Exception e) {  
  9.             System.err.println("非資料型別不能轉換。");  
  10.             //e.printStackTrace();
  11.         }  
  12. }  
處理結果如下:

非資料型別不能轉換。

說明:某個函式或某段程式塊不管會不會,有沒可能丟擲異常,都可以加try{...}catch{...}去捕捉它。

自定義異常

使用者可以自定義異常,新建一個異常類,讓其繼承Exception類或Exception的某個子類。然後用throw丟擲自己定義的異常類物件。如:

  1. publicstaticvoid function() throws ParenthesisMatchingException{  
  2.         String s = "((a+b)";  
  3.         ParenthesisMatchingException e = new ParenthesisMatchingException("括號匹配異常!");  
  4.         if(s.charAt(0)=='(' && s.charAt(1)=='(') {  
  5.             throw e;  
  6.         }  
  7.         System.out.println(s);  
  8.     }  
  9.     publicstaticvoid main(String[] args) {  
  10.         try {  
  11.             function();  
  12.         } catch (Exception e) {  
  13.             System.out.println(e.getMessage());  
  14.             //e.printStackTrace();
  15.         }  
  16. }  

結果如下 :

括號匹配異常!

相關推薦

Javathrowthrows介紹

異常處理機制 異常處理是對可能出現的異常進行處理,以防止程式遇到異常時被卡死,處於一直等待,或死迴圈。 異常有兩個過程,一個是丟擲異常;一個是捕捉異常。 丟擲異常 丟擲異常有三種形式,一是throw,一個throws,還有一種系統自動拋異常。下面它們之間的異同。 系統自動拋異常 當程式語句出現一些邏輯錯誤、

安全程式設計(十四)- Javathrowthrows的區別

1.粗淺來說         throw是一個語句丟擲異常,throws是一個方法丟擲異常;         throw不是和try-catch-finally配套使用就是和throws配套使用,而throws可

javaComparableComparator介紹

Comparable和Comparator介面都是為了對類進行比較,眾所周知,諸如Integer,double等基本資料型別,java可以對他們進行比較,而對於類的比較,需要人工定義比較用到的欄位比較邏輯。 一、Comparable簡介   Comparable是排序介面。若一個類實現了Co

Java基礎-throwthrows

雖然瞭解一些有關 Java 的異常處理,但是發現自己對 throw 和 throws 二者還不是很清楚,所以想深入的理解理解。 丟擲異常的三種方式 系統自動丟擲異常、throw 和 throws三種方式。 1、系統自動丟擲異常 public class ThrowTest { p

Java學習筆記之三十二】淺談Javathrowthrows的用法及異常拋出處理機制剖析

input auto void ref 淺談 .html ssa 不能 而是 異常處理機制 異常處理是對可能出現的異常進行處理,以防止程序遇到異常時被卡死,處於一直等待,或死循環。 異常有兩個過程,一個是拋出異常;一個是捕捉異常。 拋出異常 拋出異常有三種

Java關鍵字throwthrows的區別

丟擲異常有三種形式 throw throws 系統自動拋異常 一、系統自動拋異常 當程式語句出現一些邏輯錯誤、主義錯誤或型別轉換錯誤時,系統會自動丟擲異常:(舉個栗子) public static void main(String[] args) {

Java異常分類ThrowThrows的區別

#### 1.異常分類 Throwable是Java中所有錯誤和異常的超類。它的下一級是Error和Exception ##### 1.1 Error(錯誤) Error是指程式執行時系統的內部錯誤和資源耗盡錯誤。程式不會丟擲該類物件。如果出現了Error,代表程式執行時JVM出現了重大問題,比如常見的Out

java自定義異常以及throwthrows關鍵字

java中內建了很多可能在程式設計時出現的大部分異常。除此之外,使用者可以使用一個類繼承Exception類即可繼承自定義類異常。 在程式中自定義類,大體上分為以下幾個步驟: 建立自定義異常類 在方法中通過throw關鍵字丟擲異常物件。 如果在當前丟擲異常的方法中處理異常,

Javacatchthrow同時使用

一應用背景        在實際應用中,處理異常往往需要更加複雜的處理——當一個異常出現時,單靠某個方法無法完全處理該異常,必須由幾個方法協作才能完全處理該異常,也就是說,在異常出現的當前方法中,程式

Java物件詳細介紹

static void main(String[] args) { //1 int i = 2; changeValue(2);//方法中x複製了i的值,為2,方法執行結束x=6,但是i的值不變 System.out.prin

Java"throw new Exception() ""new Exception()"的區別

throw new Exception(String, Exception) throw new Exception(String) throw是明確地丟擲異常 ////throws的作用/////////////////////////////////// 宣告方法可能

Java異常----自定義異常類(throwthrows關鍵字的用法)

Java的異常處理的五個關鍵字, try、catch、finally、throw、throws 的關係: 處理異常方式: 1  try-catch  捕獲到異常後在catch中進行處理                           2  throws   

throwthrows

int 出現異常 程序員 代碼 產生 修飾符 exc 數列 new 區別一: throw 是語句拋出一個異常;throws 是方法拋出一個異常; throw語法:throw <異常對象>

JavaIntegerint比較大小出現的錯誤

最好 裏的 pan 轉換 als 範圍 urn 返回 錯誤 Java在某一處維護著一個常量池,(我記得)在小於128的範圍內,直接用 1 Integer i = 100; 2 int j = 100; 3 return i == j;//true 這裏返回的是true.

javaArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

java棧的區別

mem 線程 所有 生成 werror 空間 調用 訪問 指向 01,各司其職;         棧內存用來存儲局部變量和方法的調用,         而堆內存用來存儲java中的對象,無論是成員變量,局部變量,還是類變量         他們指向的對象都存儲在堆內存中。

JavaPreparedStatementStatement的用法區別

aik txt 實例 什麽 一點 所有 一個 drop passwd Java中PreparedStatement和Statement的用法區別 (2012-08-01 11:06:44) 轉載▼ 標簽: 雜談 1、 PreparedStatem

javaComparator Comparable的區別

true public arr ins ride err instance ural code 1、Comparable的代碼如下: public interface Comparable<T> { public int compareTo(T o);

JAVA日期時間的格式化選項

println 對象 bsp lec pub cti class 日子 月份 一、使用printf方法 1 import java.util.Date; 2 import java.util.Scanner; 3 4 5 public class Test

【轉載】JavaComparableComparator比較

import 比較器 todo itl 復制代碼 ack div array open 【本文轉自】http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 簡介 Comparable 是排序接口。 若一