我们可以说try-catch块是java中处理异常的唯一方法吗?

问题描述 投票:0回答:4

所以基本上,如果我们在方法签名中使用

throws
关键字,我们会将处理责任传递给调用者方法;如果我们使用
throw
关键字,我们就会显式抛出异常。
throws
throw
都不是处理异常的方法。只有
catch
块中的语句才可以被视为处理异常的方法,因为我们的程序不会因为我们处理了异常而终止。我理解正确吗?因为在 Java 面试中我们总是被问到如何处理 Java 中的异常。

java exception try-catch throw throws
4个回答
1
投票

是的,我同意,大部分同意。

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

1
投票

这是正确的。

当抛出异常时,你只有两个选择 - 要么

catch
要么允许它向上抛出给调用者。最终,如果它从未被捕获,线程将终止。


0
投票

异常由

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

Java 教程

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


0
投票

尝试捕捉
  1. 线程::setUncaughtExceptionHandler
  2. ThreadGroup::uncaughtException(线程,可抛出)
  3. [全局]
  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

© www.soinside.com 2019 - 2024. All rights reserved.