再探Java基礎——throw與throws

来源:http://www.cnblogs.com/Miracle-Maker/archive/2016/12/31/6239346.html
-Advertisement-
Play Games

轉載:http://blog.csdn.net/luoweifu/article/details/10721543 我進行了一些加工,不是本人原創但比原博主要更完善~ 淺談Java異常 以前雖然知道一些異常的處理,也用過一些,但是對throw和throws區別還是有不太清楚。今天用實例測試一下 異常 ...


轉載:http://blog.csdn.net/luoweifu/article/details/10721543 我進行了一些加工,不是本人原創但比原博主要更完善~

淺談Java異常

以前雖然知道一些異常的處理,也用過一些,但是對throwthrows區別還是有不太清楚。今天用實例測試一下

異常處理機制

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

異常有兩個過程,一個是拋出異常;一個是捕捉異常

拋出異常

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

系統自動拋異常

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

1 public static void 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 public static void 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 public static void main(String[] args) {  
2         String s = "abc";  
3         if(s.equals("abc")) {  
4             throw new 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     public static void function() throws NumberFormatException{  
 2             String s = "abc";  
 3             System.out.println(Double.parseDouble(s));  
 4         }  
 5           
 6         public static void main(String[] args) {  
 7             try {  
 8                 function();  
 9             } catch (NumberFormatException e) {  
10                 System.err.println("非數據類型不能轉換。");  
11                 //e.printStackTrace();  
12             }  
13     }   

  處理結果如下:

  非數據類型不能轉換。

  • throw與throws的比較

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

2throws表示出現異常的一種可能性,並不一定會發生這些異常;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 public static void function1() throws NumberFormatException{  
 2         System.out.println(Double.parseDouble("abc"));  
 3         System.out.println("第二條語句。");  
 4           
 5     }  
 6   
 7     public static void main(String[] args) {  
 8         try {  
 9             function1();  
10         } catch (Exception e) {  
11             System.err.println(e.getMessage());  
12             //e.printStackTrace();  
13         }  
14 } 

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

For input string: "abc"

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

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

 1     public static void function() {  
 2             String s = "abc";  
 3             System.out.println(Double.parseDouble(s));  
 4         }  
 5           
 6         public static void main(String[] args) {  
 7             try {  
 8                 function();  
 9             } catch (Exception e) {  
10                 System.err.println("非數據類型不能轉換。");  
11                 //e.printStackTrace();  
12             }  
13     }  

  處理結果如下:

非數據類型不能轉換。

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

  • 自定義異常

用戶可以自定義異常,新建一個異常類,讓其繼承Exception類或Exception的某個子類。然後用throw拋出自己定義的異常類對象。

在進行程式開發的過程中,自定義異常遵循以下四個步驟:

  1)首先創建自定義異常類,語法格式:自定義異常類名 extends Exception。

  2)在方法中通過關鍵字throw拋出異常對象。

  3)若是在當前拋出異常的方法中處理異常,可以用try-catch語句捕獲並處理;若不是,在方法的聲明處通過關鍵字throws指明要拋出給方法調用的異常。

4)在出現異常方法的調用中捕獲並處理異常

如:

 1 package packageone;
 2 
 3 //自定義異常類
 4 class MyException extends Exception{
 5     public MyException(String s){
 6         super(s);
 7     }
 8 }
 9 
10 /*
11  * 設計類Number,類中有除法計算方法。使用自定義異常類
12  */
13 class Number{
14     public int divition(int num1,int num2) throws MyException {
15         if (0==num2) {
16             throw new MyException("分母不能為零!");
17         }
18         return (num1/num2);
19     }
20 }
21 //測試自定義異常類
22 public class ExceptionTest{
23     public static void main(String[] args) {
24         Number n = new Number();
25         try {
26             System.out.println("自定義兩個數的商的結果為:"+n.divition(12, 0));
27         } catch (MyException e) {
28             System.out.println(e.getMessage());
29             e.printStackTrace();
30         }
31     }
32 }

 

 

  處理結果如下:   分母不能為零!

packageone.MyException: 分母不能為零!

at packageone.Number.divition(ExceptionTest.java:16)

at packageone.ExceptionTest.main(ExceptionTest.java:26)

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在學習CGlib動態代理時,遇到如下錯誤: Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V 經過百度上尋找答案,是jar包衝突導致,解決方案: 把cgli ...
  • 今天學習主要內容: Python: 1、with語句(補充昨天的文件操作) 用with打開的文件在腳本結束會自動關閉,以防普通打開方式忘記關閉文件連接 語法: with open("demo.txt","r",encoding="utf-8") as file: for line in file: ...
  • JVM的類載入機制就是:JVM把描述類的class文件載入到記憶體,並對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型 ...
  • 假設網站A有以下功能需求:1,pc端微信掃碼登錄;2,微信瀏覽器中的靜默登錄功能需求,這兩種需求就需要用到用戶的unionID,這樣才能在多個登錄點(終端)識別用戶。那麼這兩種需求下用戶的unionID該如何獲取呢? 1,先看pc端的解決方案 以snsapi_login為scope發起網頁授權,先拿 ...
  • 攔截導彈動態規劃問題 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。 輸入導彈 ...
  • DispatcherServlet是Spring MVC的核心,按照傳統方式, 需要把它配置到web.xml中. 我個人比較不喜歡XML配置方式, XML看起來太累, 冗長繁瑣. 還好藉助於Servlet 3規範和Spring 3.1的功能增強, 可以採用一種全新的,更簡潔的方式配置Spring M ...
  • 作者:虛靜 鏈接:https://zhuanlan.zhihu.com/p/24656161 來源:知乎 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 先說明幾件事: 題目的意思是,用於獲取“QQ空間動態”的爬蟲,而不是”針對QQ空間“的”動態爬蟲“ 這裡的QQ空間動態,特指 ...
  • 如果SSH框架下,前段頁面通過from表單提交數據之後,在後臺對象顯示空值,也就是接收不到值得情況下。首先保證前段輸入框有值,這個可以在提交的時候用jQuery的id或者name選擇器alert彈出測試下。如果前段彈出顯示有值的情況下。可以去後臺action中看看接受的對象有沒有給get跟set方法 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...