[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...finally,丟擲throws)
一. 集合總結 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
啟動Tomcat,丟擲java.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沒有所為