Java 试抓块的成本是多少?

Java 试抓块的成本是多少?,java,performance,try-catch,Java,Performance,Try Catch,更好的是: if (condition) { try { //something } catch(SomeEx ex) {} } 与此相反: try { if (condition) { //something } } catch(SomeEx ex) {} 当我进入try块时,JVM实际上做了什么 编辑: 我不想知道,在第二个例子中,总是去尝试。。。请回答这个问题 if (condition) { try { //something

更好的是:

 if (condition) {
  try {
   //something
  } catch(SomeEx ex) {}
 }
与此相反:

 try {
   if (condition) {
     //something
   }
 } catch(SomeEx ex) {}
当我进入try块时,JVM实际上做了什么

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

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

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

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

if (condition) {
  try {
    //something
  } catch(SomeEx ex) {}
}
确保,
if(条件)
本身不会引发
异常

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

if (someObject!=null) {
  try {
     someObject.getSomething(); // getSomething() potentially throws some Exception
  } catch(SomeEx ex) {}
}
当我进入try块时,JVM实际上做了什么

阅读

在这里,您处理了异常,如果它出现在if的条件下,那么它也出现在
if块
的内部

if (condition) {try {...} catch(SomeEx ex) {}}
在这里,您可以处理异常if,它仅出现在
if块
中。如果在这种情况下出现问题,那么它将不会得到处理


因此,这取决于实际的塞纳里奥

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

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

发件人:

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

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

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

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

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

      • 如果该块由于任何原因突然完成,那么try语句也会因为同样的原因突然完成

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

  • 如果try块的执行由于任何其他原因突然完成,那么try语句也会由于相同的原因突然完成

编辑:

有关完整的异常描述,请参见《新白痴的答案》中的JVM2.10

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


所以,如果你怀疑你的If条件是否会抛出一个异常,就把它放在里面,否则就放在外面

在运行时执行时,只要没有异常,try就不会花费任何费用。它只会在异常发生时花费运行时间。在这种情况下,if评估要慢得多

在JVM规范中,您可以看到在执行路径上没有生成额外的字节代码:

这取决于您的使用情况和实际情况。@Nandkumar Tekale:不是,不是。。它总是一样的。因为我们有相同的JAVA。我说的可能是重复的。。您能回答这个问题吗?JVM编译try块并验证catch块或finally块。我认为优势不在于编译时,而在于运行时。编译时,我认为没有任何优势,请开始尝试block@Smolda-我不理解你的评论。您想说规范示例代码中的
aload_0
是供您尝试的吗?事实并非如此。它是加载下一行中方法调用的
引用。无论您是否使用try,这都是必需的。示例代码中的注释有点误导。这个答案并没有真正解释任何事情,也不太可能是正确的。由于异常主要是运行时(JVM)的特性,而不是字节码的特性,所以字节码是不相关的。如果您想评估实际成本,您必须查看JVM在进入try块时做了什么(或者它为JIT编译的代码生成了什么汇编器)。无论如何,它肯定不是免费的。看来我对费用的看法有些错误。它可以是免费的(即OP的例子中同样昂贵),但不是出于这里所述的原因。看,这是胡说八道。如果条件不太可能,则测试和捕获的开销是不必要的,该建议还引入了(a)计时窗口问题(b)两次测试完全相同的条件的问题和(c)必须两次编写相同的错误处理代码的问题-1@EJP(1)我不同意你的观点,避免某个NPE要比要求对方稍后再扔它好。(2) 它不是两次测试相同的条件,请阅读代码中的注释(3)我最好使用catch块来捕获潜在的检查异常,而不是运行时异常!
if (condition) {try {...} catch(SomeEx ex) {}}
>try {
    code
}
catch and finally blocks . . .