Java:Throwable没有抓住

时间:2017-11-28 15:56:47

标签: java exception throwable

我在java中获得了这段代码:

jhon 2
Sam 3

我希望抓住Throwable捕获任何异常 - 错误。但是,输出如下:

    public static void main(String[] args) {
        try{
            Class tryLoadingClass = Class.forName("com.sun.deploy.uitoolkit.impl.fx.ui.MixedCodeInSwing");
    }
    catch (Throwable t){
        System.out.println("we caught a throwable");
    }  
}

为什么没有抓住异常,我怎么能抓住它?

2 个答案:

答案 0 :(得分:2)

您提供的堆栈跟踪显示问题实际上不是直接加载"com.sun.deploy.uitoolkit.impl.fx.ui.MixedCodeInSwing"类,它确实找到了一个。但是,在加载该类的过程中,它还会尝试加载com/sun/deploy/ui/DialogTemplate,这就是它失败的部分。

我用Google搜索了"com.sun.deploy.uitoolkit.impl.fx.ui.MixedCodeInSwing",然后遇到了我认为是您尝试加载的这个类的源代码。这是指向特定代码行的链接,而这些代码行反过来又试图加载DialogTemplate:https://github.com/barchart/barchart-javafx-study/blob/master/barchart-oracle-javafx-2.2.7/src/main/java/com/sun/deploy/uitoolkit/impl/fx/ui/MixedCodeInSwing.java#L76

您会注意到该特定代码行已经在try {}块中,并且之后已经有一个catch {}块,它会在您有机会捕获它之前捕获ClassNotFoundException,并打印出在以下代码行堆栈跟踪:https://github.com/barchart/barchart-javafx-study/blob/master/barchart-oracle-javafx-2.2.7/src/main/java/com/sun/deploy/uitoolkit/impl/fx/ui/MixedCodeInSwing.java#L105

因此,总而言之,您尝试加载的类已经在您有机会之前捕获错误,打印其堆栈跟踪,并且不会再次抛出错误,因此没有剩下任何内容为了你抓住

答案 1 :(得分:0)

当我尝试重现它时,我可以看到异常被捕获

但它在MixedCodeInSwing类中打印,因此它将显示在控制台中。

来自MixedCodeInSwing的

片段(已反编译):

   static {
    try {
        tClass = Class.forName("com.sun.deploy.ui.DialogTemplate", true, (ClassLoader)null);
        cMethod = tClass.getDeclaredConstructor(AppInfo.class, Component.class, String.class, String.class, Boolean.TYPE);
        cMethod.setAccessible(true);
        setContentMethod = tClass.getDeclaredMethod("setMixedCodeContent", String.class, Boolean.TYPE, String.class, String.class, String.class, String.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE, String.class);
        setContentMethod.setAccessible(true);
        getDialogMethod = tClass.getDeclaredMethod("getDialog");
        getDialogMethod.setAccessible(true);
        setVisibleMethod = tClass.getDeclaredMethod("setVisible", Boolean.TYPE);
        setVisibleMethod.setAccessible(true);
        disposeMethod = tClass.getDeclaredMethod("disposeDialog");
        disposeMethod.setAccessible(true);
        getAnswerMethod = tClass.getDeclaredMethod("getUserAnswer");
        getAnswerMethod.setAccessible(true);
        sysUtils = Class.forName("sun.plugin.util.PluginSysUtil", false, (ClassLoader)null);
        createSysThreadMethod = sysUtils.getMethod("createPluginSysThread", Runnable.class);
    } catch (Exception var1) {
        var1.printStackTrace();
    }

}