try catch块的成本是多少?

时间:2013-07-31 09:15:16

标签: java performance try-catch

好多了:

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

而不是:

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

当我输入try block时,JVM实际上做了什么?

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

6 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

如果在if-block内出现if也是如此,则处理异常。

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

如果仅在if-block内出现异常,则处理异常。如果在if条件下出现问题则不会被处理。

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

答案 2 :(得分:1)

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

请参阅Should java try blocks be scoped as tightly as possible

  

当我输入try block时,JVM实际上做了什么?

来自JLS 14.20.1. Execution of try-catch

  

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

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

  •   
  • 如果由于抛出值V而导致try块的执行突然完成,则可以选择:

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

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

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

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

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

  •   

编辑:

有关完整的异常说明,请参阅 The New Idiot的回答中的JVM 2.10 link

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

异常应该是例外情况,而不是每次代码运行时。最好在try之前检查条件!

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

请确保if (condition)本身不会引发Exception

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

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

当我输入try block时,JVM实际上做了什么?

阅读JVM spec 2.10

答案 5 :(得分:0)

If you see oracle docs

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

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

所以,如果您对If条件感到怀疑throw exception将其置于其中。否则将其放在外面。