java - ClassNotFoundException 被神奇地取消选中

标签 java exception

我的主工作线程如下所示:

public final class Worker
implements Runnable {

    @Override
    public void run() {
        try {
            _run();
        }
        catch (RuntimeException e) {
            // Cleanup carefully
        }
    }

    private void _run() {
        // do work here
    }
}

想象一下,当Thread.UncaughtExceptionHandler报告一个未捕获的java.lang.ClassNotFoundException实例(一个检查异常)时,我会感到惊讶。

(根本原因是另一个问题:我们在运行时覆盖开发环境中的 JAR 文件。)

在我的书中,这看起来像 Sneaky Throw 。为什么这个异常不是 RuntimeException?

示例堆栈跟踪(已清理):

Caused by: java.lang.ClassNotFoundException: xyz
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 10 more
Caused by: java.util.zip.ZipException: error reading zip file
        at java.util.zip.ZipFile.read(Native Method)
        at java.util.zip.ZipFile.access$1400(ZipFile.java:61)
        at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:717)
        at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:420)
        at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
        at java.util.jar.Manifest$FastInputStream.fill(Manifest.java:441)
        at java.util.jar.Manifest$FastInputStream.readLine(Manifest.java:375)
        at java.util.jar.Manifest$FastInputStream.readLine(Manifest.java:409)
        at java.util.jar.Attributes.read(Attributes.java:376)
        at java.util.jar.Manifest.read(Manifest.java:199)
        at java.util.jar.Manifest.<init>(Manifest.java:69)
        at java.util.jar.JarFile.getManifestFromReference(JarFile.java:199)
        at java.util.jar.JarFile.getManifest(JarFile.java:180)
        at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:780)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:422)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
        ... 16 more

最佳答案

为什么这个异常不是 RuntimeException?

这是java.lang.ClassNotFoundException层次结构

java.lang.Object
 java.lang.Throwable
  java.lang.Exception
   java.lang.ReflectiveOperationException
     java.lang.ClassNotFoundException

如您所见,它不会以任何方式扩展具有此层次结构的 RuntimeException

java.lang.Object
 java.lang.Throwable
  java.lang.Exception
   java.lang.RuntimeException

如果你想同时捕获它们; 捕获异常

如果你想捕获全部; 捕获可抛出

最后,如果您想了解有关层次结构继承的更多信息,您可以从这里开始:Inheritance - Java doc

关于java - ClassNotFoundException 被神奇地取消选中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33823486/

相关文章:

java - 即使输入有额外的标记,ANTLR 3.5.2 也会匹配规则

java - 如何循环回到字符串的开头? super 技能,加密-解密

Java:如何使两个记录器写入不同的文件(Logger)

java - 在 Windows 中从命令行执行 java 程序失败

java - 在 catch block 中抛出异常需要另一个 try catch block

PHP fatal error : Uncaught exception 'Exception'

c# - 似乎无法处理 XMLException?

java - 如何在 JFrame 中动态添加 JPanel?

java - 创建通用类型适配器类不起作用

ruby-on-rails - 如何处理 gem 的异常