Java Try-Catch最终阻塞而不捕获

Java Try-Catch最终阻塞而不捕获,java,try-catch,finally,try-catch-finally,try-finally,Java,Try Catch,Finally,Try Catch Finally,Try Finally,我正在复习一些新代码。该程序只有一个try和一个finally块。由于catch块被排除在外,如果try块遇到异常或任何可丢弃的东西,它将如何工作?它是否直接转到finally块?如果try块中的任何代码都可以抛出选中的异常,那么它必须出现在方法签名的throws子句中。如果抛出未经检查的异常,它将从方法中冒泡出来 无论是否引发异常,finally块始终被执行。您不尝试使用该程序吗?它将转到finally块并执行finally块,但是不会处理异常。但是,这个例外可以在finally块中被否决 如

我正在复习一些新代码。该程序只有一个try和一个finally块。由于catch块被排除在外,如果try块遇到异常或任何可丢弃的东西,它将如何工作?它是否直接转到finally块?

如果try块中的任何代码都可以抛出选中的异常,那么它必须出现在方法签名的throws子句中。如果抛出未经检查的异常,它将从方法中冒泡出来


无论是否引发异常,finally块始终被执行。

您不尝试使用该程序吗?它将转到finally块并执行finally块,但是不会处理异常。但是,这个例外可以在finally块中被否决

如果是,try块如何工作 遇到异常或任何事情 丢弃的

异常被抛出块外,就像在任何其他未捕获异常的情况下一样


无论try块如何退出,finally块都会被执行——不管是否有捕获,也不管是否有匹配的捕获


catch块和finally块是try块的正交部分。你可以选择其中一个,也可以两者兼有。有了Java7,您将两个都不能拥有

finally块总是在try块结束后运行,无论try是正常结束还是由于异常(呃,可丢弃)而异常结束

如果try块中的任何代码引发异常,那么当前方法只需重新引发(或继续引发)相同的异常(在运行finally块之后)

如果finally块抛出一个异常/错误/throwable,并且已经有一个挂起的throwable,那么它会变得很糟糕。坦率地说,我完全忘记了发生了什么(多年前我的认证就是这样)。我认为这两个一次性的东西是联系在一起的,但是你必须做一些特殊的巫术(例如,我必须查找一个方法调用)才能在“最终”呕吐之前解决最初的问题,呃,呕吐

顺便说一句,try/finally是资源管理中非常常见的操作,因为java没有析构函数

例如:

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc
“最后”,还有一个提示:如果您确实费心放入一个catch,可以捕获特定(预期)的throwable子类,或者只捕获“throwable”,而不是“Exception”,用于一般的catch-all错误陷阱。太多的问题,例如反射错误,会抛出“错误”,而不是“异常”,这些问题会被任何编码为以下内容的“一网打尽”所忽略:

catch ( Exception e) ...  // doesn't really catch *all*, eh?
改为这样做:

catch ( Throwable t) ...

在try块完成后执行finally块。如果某个内容在离开try块时抛出到try块内部,则执行finally块。

关于
try
/
finally
:finally将始终执行,除非

  • 调用
    System.exit()
  • JVM崩溃了
  • try{}
    块永不结束(例如,无限循环)

Java语言规范(1)描述了如何执行
try-catch-finally
。 没有捕获就等同于没有能够捕获给定可丢弃对象的捕获

  • 如果try块的执行由于抛出值V而突然完成,则有一个选择:
    • 如果V的运行时类型可分配给try语句的任何catch子句的参数,则…
    • 如果V的运行时类型不可分配给try语句的任何catch子句的参数,则执行finally块。还有一个选择:
      • 如果finally块正常完成,那么try语句会因为抛出值V而突然完成
      • 如果finally块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且值V的抛出被丢弃和遗忘)


(1) 在将异常抛出到外部块之前,将执行内部finally

public class TryCatchFinally {

  public static void main(String[] args) throws Exception {

    try{
        System.out.println('A');
        try{
            System.out.println('B');
            throw new Exception("threw exception in B");
        }
        finally
        {
            System.out.println('X');
        }
        //any code here in the first try block 
        //is unreachable if an exception occurs in the second try block
    }
    catch(Exception e)
    {
        System.out.println('Y');
    }
    finally
    {
        System.out.println('Z');
    }
  }
}
导致

A
B
X
Y
Z

版本7之前的Java版本允许这三种组合try catch finally

try - catch
try - catch - finally
try - finally
无论
try
或/和
catch
块中发生了什么,都将始终执行
finally
块。因此,如果没有
catch
块,这里将不会处理异常

然而,您仍然需要在代码中的某个地方使用异常处理程序——当然,除非您希望应用程序完全崩溃。它取决于应用程序的体系结构以及处理程序的具体位置

  • Java try块后面必须跟catch或finally块
  • 对于每个try块,可以有零个或多个catch块,但只有一个finally块
  • 如果程序退出(通过调用System.exit()或导致导致进程中止的致命错误),则不会执行finally块

try
块中,我们编写可以引发异常的代码。
catch
块是我们处理异常的地方。 无论是否发生异常,始终执行
finally

现在,如果我们使用try-finally块而不是try-catch-finally块,那么异常将不会被处理,在try块而不是控件进入catch块之后,它将进入finally块。
当我们不想对异常执行任何操作时,可以使用try finally块。

无论在
try
block中是否引发异常,都将执行
finally
块。例外情况不会被发现。

可能重复的@mP每个人都应该进行代码审查,并向他们提问如何学习和改进。第一段不一定正确。Try块可以嵌套。任何未捕获的异常,无论是否未选中,都将从方法中冒泡出来。Try块可以嵌套,但我不建议这样做。