代码之家  ›  专栏  ›  技术社区  ›  Debajit

Java:catch(final somee)的意思是什么?

  •  31
  • Debajit  · 技术社区  · 14 年前

    final 在下面的Java表达式中做什么?

    catch (final SomeExceptionType e)
    
    4 回复  |  直到 11 年前
        1
  •  39
  •   Edwin Buck    14 年前

    它基本上意味着:

    将“SomeExceptionType”捕获到变量“e”中,并承诺在处理异常期间不会将不同的异常分配给“e”。

    大多数情况下,这是过度杀戮,好像我正在将异常捕获到一个临时变量名中(e仅对异常处理块有效),我不必严格地控制自己,以免不信任自己将不同的(可能创建的)异常分配给同一个变量名。

    也就是说,也许这个区块是由一个由不同想法的人组成的团队维护的,人们只是想非常确定e是最初捕获的例外。

    ----根据评注编辑----

    我想不出一个很好的理由来这么做。由于“e”不是成员(静态或其他),编译后类文件不会使用名称“e”。说明这一点的另一种方法是,当您输入JVM字节码的异常处理块时,对象将不会被分配给JVM处理框架可以访问的任何成员名称,它将被推送到线程当前框架的内部处理堆栈。

    即使两个线程访问同一个对象,每个线程都有自己的帧,因此编译器从一个帧的内部堆栈中删除的“e”名称不能被另一个线程更改。

    这就是为什么

    public int safe() {
      int x = 5;
      x = x + 5;
      return x;
    }
    

    通常被认为是线程安全的,因为它做到了这一点(在伪字节码中)

    (In the thread's current frame)
    push 5
    push 5
    add integers
    return
    

    int x = 5;
    
    public void unsafe() {
      x = 5;
      x = x + 5;
      return x;
    }
    

    因为它能做到这一点

    (in the thread's current frame)
    push "this"
    push 5
    set member x
    push "this"
    get member x
    push 5
    add integer
    set member x
    get member x
    return
    

    后一个字节码很明显,将两个线程交错使用成员x作为中介创建线程间通信,而第一个代码块不能有任何线程间通信,因为没有中介。

        2
  •  11
  •   Bill the Lizard Drew    12 年前

    现在它意味着 final 与任何局部变量一样,只是它总是“确定赋值”。

    在最近的JDK7构建中, a Project Coin language change 允许它指示正在进行的隐式静态类型的程度。单身汉 catch 可以通过一个公共基类型捕获多个不同的已检查异常,并在封闭上下文中仅捕获或声明那些可以(静态地说)在 try

        3
  •  5
  •   Austin    5 年前

    final 你觉得呢?”在这个问题的其他答案中提到,以及 here , here ,和 here . 但是在一个 布洛克,那个 Java Language Specification (JLS) §4.12.4 states (我自己强调):

    • 资源 try with resources语句 (§14.20.3)和 多重捕获子句 隐式声明为final .
    • 的异常参数 (§14.20)可以有效地是最终的,而不是明确宣布为最终的。这样的参数是 从不隐式声明为最终 .

    在多重catch子句中

    添加 最终的 关键字到 多重捕获子句 variable 是隐式的。一般来说 最终的

    在uni catch子句中

    另一方面,异常参数 从未 关键字到 防止发生以下情况:

    try {
         throw new Exception();
    catch (Exception e){
        e = null;
        e.printStackTrace(); //throws a NullPointerException
    }
    

    最终的 :

    1. 最终的 而不是运行时

    一般来说,使用 最终的 统一条款 in the same way you would use the final keyword for a method parameter

    JLS§4.12.4 :声明变量final可以作为有用的文档,使其值不会更改,并有助于避免编程错误。

        4
  •  2
  •   Thorbjørn Ravn Andersen    14 年前

    这个 final 关键字on variables意味着变量只能被赋值一次,并且由于这里的赋值是由编译器完成的,这意味着变量在以后的代码中不能被更改。

    这是一个重要的属性,因为对于维护人员来说,这意味着这个特定的变量在使用它的任何地方都将具有这个特定的值,并且不必跟踪它在何处更改。这被认为是非常有用的,以至于Eclipse中的“Clean-up”操作允许在任何可能的地方添加“final”,我相信您看到的是 结果