【问题标题】:Can we say that the try-catch block is the only way to handle an exception in java?我们可以说 try-catch 块是 java 中处理异常的唯一方法吗?
【发布时间】:2021-10-28 05:32:22
【问题描述】:

所以基本上如果我们在方法签名中使用throws 关键字,我们就是将处理责任传递给调用者方法;如果我们使用throw 关键字,我们会明确地抛出一个异常。 throwsthrow 都不是处理异常的方法。只有 catch 块中的语句可以被认为是处理异常的方式,因为我们的程序不会终止,因为我们已经处理了异常。我得到正确了吗?因为在 Java 面试中,我们总是被问到如何处理 Java 中的异常。

【问题讨论】:

    标签: java exception try-catch throw throws


    【解决方案1】:

    很快,回答是这样排序的:

    1. 尝试捕捉
    2. 线程::setUncaughtExceptionHandler
    3. ThreadGroup::uncaughtException(Thread, Throwable)
    4. [全局] Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler)

    请注意,这个列表更多的是关于 JVM 机制而不是“框架”。

    如果您想要更多,我相信您可以使用下面的代码并查看使用的方法和类的文档。

    public static void main(String[] args) throws InterruptedException {
        System.out.println("START main");
    
        Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
            System.err.println("Thread.setDefaultUncaughtExceptionHandler");
        });
        Thread.currentThread().setUncaughtExceptionHandler((t, e) -> {
            System.err.println("thread[main].uncaughtException");
        });
    
        java.util.concurrent.ThreadFactory threadFactory = r -> {
            ThreadGroup g = new ThreadGroup("eta") {
                @Override
                public void uncaughtException(Thread t, Throwable e) {
                    System.err.println("threadGroup.uncaughtException");
                }
            };
            Thread thread = new Thread(g, r);
            thread.setUncaughtExceptionHandler((t, e) -> {
                System.err.println("thread.uncaughtException");
            });
            return thread;
    //            return new Thread(r);
        };
    
        threadFactory.newThread(() -> {
            System.out.println("START newThread logic");
            throw new RuntimeException();
        }).start();
    
        if (true) throw new RuntimeException();
    }
    

    输出:

    START main
    START newThread logic
    thread[main].uncaughtException
    thread.uncaughtException
    

    【讨论】:

      【解决方案2】:

      这是正确的。

      当抛出异常时,您只有两个选择 - catching 或允许将其向上抛出给调用者。最终,如果它从未被捕获,线程将终止。

      【讨论】:

      • try/finally 块是否也有可能吞噬异常?
      • finally 块不会阻止抛出异常 - 它仍然需要在某处被捕获。
      • @user16320675 是的,确实如此。接得好。已编辑和修复。
      • 如果在 finally 块中执行 returnthrow 会怎样?我的回忆是,在前一种情况下,Java 会忘记发生了异常,而在后一种情况下,新的异常将删除前一个异常的任何“回忆”。
      【解决方案3】:

      异常由 try-catch 块处理,该块包装了引发异常的代码。无论它是如何使用throw 子句发出的,还是通过调用方法签名中具有throws 的方法间接发出的。如果方法抛出异常并且没有在方法签名中声明它,那么这是一种 unchecked 异常。这些异常的处理方式与您必须捕获或声明要抛出的已检查异常相同。

      Java Tutorial 中查看有关异常的更多信息。

      【讨论】:

        【解决方案4】:

        是的,我基本上同意。

        • 您可以捕获异常,然后捕获异常并处理该异常(也可能使用 finally 块,因此可能会提及)。
        • 再次向上抛。
        • 如果您正在处理线程,您还可以设置未捕获的异常行为,因此您可以在某种意义上“处理”异常,但这是一种特定情况,并不总是适用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多