try catch块的成本是多少?

好多了:

if (condition) { try { //something } catch(SomeEx ex) {} } 

而不是这个:

  try { if (condition) { //something } } catch(SomeEx ex) {} 

当我进入try块时,JVM实际上做了什么?

编辑:我不想知道在第二个例子总是进去尝试…请回答这个问题。

在运行时明智地执行,只要没有exception,尝试不会花费任何成本。 一旦发生exception,它只会花费运行时间。 在那种情况下,if评估要慢得多。

在JVM规范中,您会看到在执行路径上没有生成额外的字节代码: http : //docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.12

 try {if (condition) {...}} catch(SomeEx ex) {} 

在这里你处理了exception,如果它出现if if-block的情况也是如果if-block

 if (condition) {try {...} catch(SomeEx ex) {}} 

如果仅在if-block内部出现exception,则处理exception。 如果在条件出现问题,则不会处理。

所以它取决于实际的场景。

从性能的角度来看应该是一样的。 抛出exception是一项代价高昂的操作(对于初学者来说,必须创建并填充堆栈跟踪)。 仅仅存在try块没有(或可忽略的)性能损失。

请参阅java try块应尽可能紧密地限定范围 。

当我进入try块时,JVM实际上做了什么?

来自JLS 14.20.1。 执行try-catch :

通过首先执行try块来执行没有finally块的try语句。 然后有一个选择:

  • 如果try块的执行正常完成,则不会采取进一步操作,并且try语句正常完成。

  • 如果try块的执行由于抛出值V而突然完成,那么有一个选择:

    • 如果V的运行时类型是与(§5.2)try语句的任何catch子句的可捕获exception类兼容的赋值,则选择第一个(最左边)这样的catch子句。 将值V分配给所选catch子句的参数,并执行该catch子句的Block,然后有一个选项:

      • 如果该块正常完成,则try语句正常完成。

      • 如果该块因任何原因突然完成,则try语句突然完成,原因相同。

    • 如果V的运行时类型与try语句的任何catch子句的可捕获exception类不兼容,那么try语句会因为抛出值V而突然完成。

  • 如果try块的执行因任何其他原因而突然完成,则try语句会因同样的原因突然完成。

编辑:

有关完整的exception描述,请参阅The New Idiot的答案中的JVM 2.10 链接 。

如果你看到oracle docs

 >try { code } catch and finally blocks . . . 

标记为代码的示例中的段包含一个或多个可能引发exception的合法代码行。

所以,如果你对你的If条件感到怀疑它会throw一个exception将它放入其中。否则放在外面。

 if (condition) { try { //something } catch(SomeEx ex) {} } 

最好使用,因为如果条件正常,它会执行try块.JVM编译try块并validationcatch块或finally块。 我认为优势不是在编译时,而是在运行时。 编译时间我认为没有任何优势

exception应该是例外情况,而不是每次代码运行时。 最好在try之前检查一下情况!

 if (condition) { try { //something } catch(SomeEx ex) {} } 

确保if (condition)本身不会抛出Exception

这取决于您的使用和function。 例如,这会更好:

 if (someObject!=null) { try { someObject.getSomething(); // getSomething() potentially throws some Exception } catch(SomeEx ex) {} } 

当我进入try块时,JVM实际上做了什么?

阅读JVM规范2.10 。