1. 程式人生 > >[JAVA]運用反射機制,丟擲的異常的捕獲方法

[JAVA]運用反射機制,丟擲的異常的捕獲方法

背景介紹

筆者前些日子做過一個這樣的事情,利用反射機制呼叫一個會報Checked的異常的方法,在呼叫後沒法丟擲異常(原因是反射機制呼叫是沒法catch到Checked異常的)。舉個簡單的例子如下。
1.先定義一個簡單的異常類(這樣的定義是Checked的異常哦)

package com.zju.study.exception;

public class SimpleException extends Exception {
    private static final long serialVersionUID = 1L;
    private String Message;

    public
SimpleException(String message) { this.setMessage(message); } public String getMessage() { return Message; } public void setMessage(String message) { Message = message; } }

2.定義一個實體類Man

package com.zju.study.exception;

public class Man {
    private
String work; public String getWork() { return work; } public void setWork(String work) throws SimpleException { this.work = work; System.out.println(work); throw new SimpleException("man is died"); } }

3.最後定義Main方法。

package com.zju.study.exception;

import
java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Main { public static void main(String[] args) { Method method = null; try { method = Man.class.getMethod("setWork", String.class); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } Man man = new Man(); try { method.invoke(man, "man is hard working"); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } }

OK~~執行之,結果如下。

man is hard working
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.zju.study.exception.Main.main(Main.java:16)
Caused by: com.zju.study.exception.SimpleException: man is died
    at com.zju.study.exception.Man.setWork(Man.java:13)
    ... 5 more

這個時候的需求是!!!在invoke方法呼叫丟擲的異常在Main中被捕獲,那該如何去做呢?

大多數人可能和我一樣,覺得這種問題很簡單,加個catch語句唄。。如下。

catch (SimpleException e) {
            e.printStackTrace();
        }

結果,報錯了!!!如下。

Unreachable catch block for SimpleException. This exception is never thrown from the try statement body

這裡我們給出解決辦法如下。
一個重要的方法,getCause()方法。具體程式碼如下。

package com.zju.study.exception;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        Method method = null;
        try {
            method = Man.class.getMethod("setWork", String.class);
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
        Man man = new Man();
        try {
            method.invoke(man, "man is hard working");
        } catch (SimpleException e) {
            e.printStackTrace();
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            Throwable cause = e.getCause();
            if(cause instanceof SimpleException){
                System.out.println("ok,we catch SimpleException:"+(SimpleException)cause);
            }

        }

    }
}

執行結果如下。

man is hard working
ok,we catch SimpleException:com.zju.study.exception.SimpleException: man is died

總結:異常中2個很重要的異常,CheckedException和RuntimeException應該能夠分清楚他們之間的區別!!!另外,反射機制請慎用,特別在對於日誌要求極高的專案中,反射機制可能一不小心就會打印出你不想要的日誌資訊(本人親身經歷,使用Spring AOP改寫程式碼日誌,日誌需要記錄報錯的具體行數以及具體資訊,用棧去跟蹤的話,層數太多,反而會使得執行效率降低。)

相關推薦

[JAVA]運用反射機制異常捕獲方法

背景介紹 筆者前些日子做過一個這樣的事情,利用反射機制呼叫一個會報Checked的異常的方法,在呼叫後沒法丟擲異常(原因是反射機制呼叫是沒法catch到Checked異常的)。舉個簡單的例子如下。 1.先定義一個簡單的異常類(這樣的定義是Checked的異常

java實現階乘的計算異常不會怎麼使用標號跳轉需要幫解決一下

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

JAVA 內層方法異常 外層方法捕捉並處理異常

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                這是一篇有關JAVA:內層方法丟擲異常,外層方法捕捉並處理異常的文章資訊。我釋出到報名線上EDU84.COM上,和大家分享一下JAVA:內層方法丟擲異常,外層方

問題描述: 在使用mybatis對資料庫執行更新操作時parameterType為某個具體的bean而bean中傳入的引數為null時異常如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mappin

關於Java反射機制你需要理解這些...

反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。【翻譯於 官方文件】 本篇將從以下幾個方面講述反射的知識: class

Java中關於try{}catch{}異常的一個例子

之前對try{ }catch{ }沒有什麼瞭解知識知道有這麼個丟擲異常的方法,今天在寫一個簡單的判斷月份的程式碼時,突然想到了如果我輸入的是字串怎麼辦,於是就想到了用try丟擲異常, 在寫的時候出現個問題,就是我定義的Scanner物件必須是在try裡面定義它的型別,因為如

番外 01:Spring IoC 實現原理簡析Java反射機制通過類名建立物件

轉載請註明來源 賴賴的部落格 前景概要 在 01 走進Spring,Context、Bean和IoC 中,我們看到了強大的Spring通過ApplicationContext實現了bean工廠(也就是物件工廠),那究竟是怎麼實現的呢,本次給大家寫一個小D

JAVA:內層方法異常 外層方法捕捉並處理異常

這是一篇有關JAVA:內層方法丟擲異常,外層方法捕捉並處理異常的文章資訊。我釋出到報名線上EDU84.COM上,和大家分享一下JAVA:內層方法丟擲異常,外層方法捕捉並處理異常public void methodA (){ try{ // 呼叫methodB methodB

Java反射機制即.getClass();

注: Class owner_class = owner.getClass() :首先還是必須得到這個物件的Class。 5~9行:配置引數的Class陣列,作為尋找Method的條件。 Method method = ownerClass.getMethod(methodName, argsClass):

商品詳情頁 瀏覽歷史中不顯示圖片和詳細資訊異常ERROR basehttp 124 "POST /admin/goods/sku/2/change/ HTTP/1.1" 500 19357

問題:商品詳情頁瀏覽歷史中不顯示圖片和詳細資訊丟擲異常django.template.exceptions.TemplateDoesNotExist: search/indexes/goods/sku_text.txtERROR basehttp 124 "POST /adm

java 利用反射機制,獲取實體所有屬性和方法,並對屬性賦值

Field[] field = model.getClass().getDeclaredFields(); // 獲取實體類的所有屬性,返回Field陣列 try { for (int j = 0; j < field.length; j++)

java之集合總結異常(try...catch...finallythrows)

一. 集合總結 1. 單列集合 (Collection) 1.1 執行緒不安全的 jdk1.2 ArrayList 查詢快 增刪慢(相對) LinkedList 查詢慢 增刪快(相對) HashSet 去重 TreeS

Intellij 代理異常錯誤: java.rmi.server.ExportException: Port already in use: 1099埠被佔用

代理丟擲異常錯誤: java.rmi.server.ExportException: Port already in use: 1099 埠被佔用 解決方案: 1.查找出佔用程序id 2.殺死程序 命令: 1.netstat -ano|findstr 1099

Java異常處理中try{}catch異常後面程式碼還會繼續執行麼?

這張圖片上面顯示的程式碼執行之後將會輸出什麼?我們可以發現在procedure()函式結束之後函式後面的內容就不運行了,而主函式裡面的程式還是會繼續執行。反過來再測試如果先發生主函式裡面的異常那麼Pr

啟動Tomcatjava.io.IOException異常

今日除錯專案時,啟動Tomcat出現java.io.IOException異常.主要錯誤提示如下: 嚴重: IOException while loading persisted sessions: java.io.EOFException 嚴重: Exception loa

JAVA語言如何進行異常處理關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以異常嗎?

   Java通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。 在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便 丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常

Java語言如何進行異常處理關鍵字:throws、throw、try、catch、finally分別代表什麼意義?在try塊中可以異常嗎?

try塊表示程式正常的業務執行程式碼。如果程式在執行try塊的程式碼時出現了“非預期”情況,JVM將會生成一個異常物件,這個異常物件將會被後面相應的catch塊捕獲。 catch塊表示一個異常捕獲塊。

JAVA 語言如何進行異常處理關鍵字:throws,throw,try,catch,finally 分別代表什麼意義?在 try 塊中可以異常嗎?

Java 通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並 提供了良好的介面。在 Java 中,每個異常都是一個物件,它是 Throwable 類或 其它子類的例項。當一個方法出現異

運用@Transactional自己異常時不會回滾的原因

問題         使用spring的配置事物註解@Transactional,在測試的時候發現不起作用。 環境          配置檔案 <beanid="studentMGDataSource"class="org.apache.common

Java 原碼、反碼、補碼自定義的異常手動異常

1.byte 型佔一個位元組,正數按原碼儲存,負數按補碼儲存。第一位為符號符,“0”表示正數,“1”表示負數。 0000 0000表示 0 ,1000 0000 表示 -0,由於byte表示的範圍為256,+0,-0對應補碼都為0000000,所以補碼10000000沒有所為