問題: 我在我的應用程序中調用了外部方法並且想捕獲它可能拋出的異常
答案: 通過一個給定的方法去處理所有運行時和檢測異常對於預防外部錯誤是不充分的
你可以去讀目前 JavaWorld文章
舉個例子
public interface IFoo
{
/**
* This method can
*/
void bar ();
} // End of interface
對於給出參數的理由是讓我們通知你這樣的服務在什麼地方
try
{
IFoo foo =
foo
}
catch (RuntimeException ioe)
{
// Handle
}
catch (Error e)
{
// Handle or re
}
並且你在這個裡處理了所有可能的異常
錯誤
public void bar ()
{
EvilThrow
}
運行Main方法
public class Main
{
public static void main (final String[] args)
{
// This try/catch block appears to intercept all exceptions that
// IFoo
try
{
IFoo foo = new EvilFoo (new java
foo
}
catch (RuntimeException ioe)
{
// Ignore ioe
}
catch (Error e)
{
// Ignore e
}
}
} // End of class
你將看到從bar()方法拋出的java
>java
Exception in thread
at Main
在這裡發生了什麼?
主要的觀察是通常針對檢測異常的Java規則僅僅在編譯的時候被執行
如果正常行為是編譯器執行
Thread
分別編譯
我用後一種選擇
public abstract class EvilThrow
{
public static void throwThrowable (Throwable throwable)
throws Throwable
{
throw throwable;
}
}
接下來
如果你編寫捕獲異常的構造器
下面示例說明了如果你沒有遵循這個建議將發生什麼
Example: Breaking SwingUtilities
javax
Sun的J
public void dispatch() {
if (catchExceptions) {
try {
runnable
}
catch (Exception e) {
exception = e;
}
}
else {
runnable
}
if (notifier != null) {
synchronized (notifier) {
notifier
}
}
}
這段代碼的問題是如果runnable
public static void invokeAndWait(Runnable runnable)
throws InterruptedException
class AWTInvocationLock {}
Object lock = new AWTInvocationLock();
InvocationEvent event =new InvocationEvent(Toolkit
true);
synchronized (lock) {
Toolkit
lock
}
Exception eventException = event
if (eventException != null) {
throw new InvocationTargetException(eventException);
}
}
讓EvilFoo實現Runnable接口
public void run ()
{
bar ();
}
然後
SwingUtilities
正如你看到的
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19675.html