Java Try Catch Finally块没有Catch

Nul*_*x00 118 java finally try-catch try-catch-finally try-finally

我正在审查一些新代码.该程序只有一个try和一个finally块.由于catch块被排除在外,如果遇到异常或任何可抛出的东西,try块如何工作?它只是直接进入finally块吗?

duf*_*ymo 124

如果try块中的任何代码都可以抛出一个已检查的异常,则它必须出现在方法签名的throws子句中.如果抛出未经检查的异常,则会将其冒出方法.

无论是否抛出异常,都始终执行finally块.

  • 第一段不一定是真的.Try块可以嵌套.任何未被检查的异常(未经检查或未经检查)都会冒出该方法. (9认同)
  • @Anand只是一些略有非技术语言的"抛出异常". (5认同)
  • Try块可以嵌套,但我不推荐它.我不会那样写代码. (4认同)
  • @duffymo:“冒出方法”是什么意思? (2认同)
  • 不容忽视;传递方法链。 (2认同)

Pet*_*rey 90

关于try/ 的小注释finally:除非最终将始终执行

  • System.exit() 叫做.
  • JVM崩溃了.
  • try{}块永远不会结束(例如无限循环).

  • 在那种情况下,最后仍将被调用.只丢失原始异常. (10认同)
  • 那么`try {..} catch {throw ..}最后{..}`怎么样?我想最终不会被执行 (4认同)
  • @jyw这就是我在上面列表中的第一项所指的意思. (2认同)

use*_*421 38

Java语言规范(1)描述了如何try-catch-finally执行.没有捕获相当于没有捕获能够捕获给定的Throwable.

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

(1)执行try-catch-finally


小智 15

内部最终在将异常抛出到外部块之前执行.

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');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是

A
B
X
Y
Z
Run Code Online (Sandbox Code Playgroud)


Rob*_*rog 6

在try块结束后总是运行finally块,无论是由于异常,er,throwable导致正常结束还是异常结束.

如果try块中的任何代码抛出异常,则当前方法只是重新抛出(或继续抛出)相同的异常(在运行finally块之后).

如果finally块抛出异常/错误/ throwable,并且已经存在挂起的throwable,则会变得很难看.坦率地说,我完全忘记了发生了什么(多年前我的认证).我认为两个throwable都链接在一起,但是你必须做一些特殊的伏都教(即 - 我必须要查找的方法调用)才能在"最终"barfed之前得到原始问题,呃,呕吐.

顺便说一句,try/finally对资源管理来说是很常见的事情,因为java没有析构函数.

例如 -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc
Run Code Online (Sandbox Code Playgroud)

"最后",多了一个提示:如果懒得摆在catch,要么捕获特定(预期)抛出的子类,或者正好赶上"的Throwable",没有 "例外",对于一般的综合性错误陷阱.太多的问题,例如反射蠢事,抛出"错误",而不是"异常",而那些将被任何"全部捕获"编码为:

catch ( Exception e) ...  // doesn't really catch *all*, eh?
Run Code Online (Sandbox Code Playgroud)

改为:

catch ( Throwable t) ...
Run Code Online (Sandbox Code Playgroud)