快速业务通道

突破Java异常处理规则 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
sitor分解结果,在汇编代码中删除throwThrowable()方法Throwable的声明,并且用Jasmin assembler 编译新的版本。

如果你编写捕获异常的构造器,那么它应该总是捕获java.lang.Throwable而不仅仅只捕获java.lang.Exception。这个规则适合你开发管理运行时的应用程序和必须执行可能包含错误甚至恶意代码的外部组件。你要确保捕获Throwable并且过滤掉错误信息。

下面示例说明了如果你没有遵循这个建议将发生什么。

Example: Breaking SwingUtilities.invokeAndWait()

javax.swing.SwingUtilities.invokeAndWait()是在AWT上执行一个线程的有用方法。当一个应用程序线程必须更新图形用户接口并且服从所有Swing线程规则的时候这个方法将被调用。一个没有捕获Runnable.run()抛出的异常将被捕获并且被封装在一个InvocationTragetException中重新抛出。

Sun的J2SE1.4.1假设这样一个未捕获的异常仅仅是java.lang.Exception的子类。这里是一个SwingUtilities.invokeAndWait()调用java.awt.event.InvocationEvent的一个分析:

public void dispatch() {   if (catchExceptions) {    try {     runnable.run();    }    catch (Exception e) {     exception = e;    }   }   else {    runnable.run();   }   if (notifier != null) {    synchronized (notifier) {     notifier.notifyAll();    }   } }

这段代码的问题是如果runnable.run()抛出一个Throwable,捕获块又没有并且notifier.notifyAll()从来不会被执行。然后调用应用线程将等待在java.awt.EventQueue.invokeAndWait()里的一个非公共锁对象(lock.wait()将从未执行):

public static void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException {   class AWTInvocationLock {}   Object lock = new AWTInvocationLock();   InvocationEvent event =new InvocationEvent(Toolkit.getDefaultToolkit(), runnable, lock, true);   synchronized (lock) {    Toolkit.getEventQueue().postEvent(event);    lock.wait();   }   Exception eventException = event.getException();   if (eventException != null) {    throw new InvocationTargetException(eventException);   } }

让EvilFoo实现Runnable接口:

public void run () {   bar (); }

然后,在Main中调用它:

SwingUtilities.invokeAndWait (new EvilFoo (new Throwable ("SURPRISE!")));

正如你看到的,未受信任代码使你的代码进入你没有准备处理的执行路径中的异常被保护起来。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号