首页 文章

Java Try Catch Finally块没有Catch

提问于
浏览 1513 次
107

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

9 回答

  • 14

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

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

  • 2

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

    • System.exit() 被调用 .

    • JVM崩溃了 .

    • try{} 块永远不会结束(例如无限循环) .

  • 86

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

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


    (1)执行try-catch-finally

  • 114

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

    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
    
  • 1

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

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

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

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

    例如 . -

    r = new LeakyThing();
    try { useResource( r); }
    finally { r.release(); }  // close, destroy, etc
    

    "Finally",还有一个提示:如果你懒得放入一个catch,要么捕获特定的(预期的)throwable子类,要么只捕获"Throwable",而不是"Exception",以获得一般的catch-all错误陷阱 . 太多的问题,例如反射蠢事,抛出"Errors",而不是"Exceptions",那些将被任何"catch all"编码为:

    catch ( Exception e) ...  // doesn't really catch *all*, eh?
    

    改为:

    catch ( Throwable t) ...
    
  • 3

    版本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块 .

  • 1

    如果try块遇到异常或任何可抛出的东西,它如何工作

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

    无论try块是如何退出的,都执行finally块 - 无论是否有任何捕获,无论是否有匹配的catch .

    catch块和finally块是try块的正交部分 . 你可以有其中一个或两个 . 使用Java 7,您将无法拥有!

  • 6

    你不尝试那个程序吗?它将最终阻止并执行finally阻止,但是,不会处理异常 . 但是,在finally块中可以推翻该异常!

  • 35

    try块完成后执行finally块 . 如果在try块中离开finally块时抛出了某些内容 .

相关问题