Java优化器是否会消除未使用其结果的代码,除非抛出异常

时间:2018-07-10 07:42:09

标签: java compiler-optimization jit

考虑以下代码(java 8):

try
{
    // try to create an instance of CardExpirationDate
    AfCardExpirationDate.getInstance( anExpMonth, anExpYear);
    return true;    // expiration date is valid
}
catch ( IllegalArgumentException e )    
{
    // invalid expiration date
    return false;
}

从未使用过调用AfCardExpirationDate.getInstance的结果。我们仅在是否抛出IllegalArgumentException的情况下在此处检查。

这样安全吗?还是可以在编译时或运行时代码优化器中取消此类调用?

1 个答案:

答案 0 :(得分:2)

编译器无法对此进行优化。简单明了。

编译器无法知道对getInstance()的无意义调用是否没有副作用。除此之外,编译器显然确实注意到您的方法具有两个返回路径,因此try / catch很重要。

除此之外,作为Java程序员,您不必关心在Java源代码和类文件字节码之间进行的优化步骤。

JIT在运行时具有概要信息,当发现该方法被频繁调用以至于值得进行优化时,它将在运行时将其编译为机器代码。做具有上下文概要文件知识的编译器可能会做的所有事情。

最后:您误将try / catch用于验证。那简直是不好的做法(例如,由于相关的运行时性能成本)。如果您真的对A)代码质量和B)运行时性能非常重视,那么只需进行完整的验证即可,而不必依赖某些代码。

相关问题