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 。
- 在将Java Date写入SQL TIMESTAMP列之前,JDBC是否将日期从JVM时区转换为数据库会话时区?
- 如何在执行测试时阻止我的Spring Boot Batch应用程序运行?
- 是否可以使用Apache POI解析MS Word并将其转换为XML?
- 如何正确停止ServerSocket线程? 关闭套接字失败
- Javareflection – 传入ArrayList作为要调用的方法的参数
- 在text / plain上使用application / json的优点?
- 如何在我的Java应用程序中使用Google Translate API?
- 单击按钮更新JTable
- 如何垂直对齐JLabel-JTextField对