Java死代码消除。。。此代码是否有被优化的风险?

Java死代码消除。。。此代码是否有被优化的风险?,java,optimization,compiler-construction,Java,Optimization,Compiler Construction,所以,我使用的API在某些方面有点不友好。基本上,这个API创建了一个可以稍后获取的资源。当我们稍后去获取该资源时,该资源可能仍然存在,也可能不存在 要获取以前创建的资源,必须使用如下结果guid: String resultKey = "12345"; PersistedResult r = mFactory.getPersistedResult(resultKey); 现在,这里的棘手问题是getPersistedResult在使用无效guid调用时不会引发异常PersistedResul

所以,我使用的API在某些方面有点不友好。基本上,这个API创建了一个可以稍后获取的资源。当我们稍后去获取该资源时,该资源可能仍然存在,也可能不存在

要获取以前创建的资源,必须使用如下结果guid:

String resultKey = "12345";
PersistedResult r = mFactory.getPersistedResult(resultKey);
现在,这里的棘手问题是
getPersistedResult
在使用无效guid调用时不会引发异常
PersistedResult
是一个延迟加载程序,只有在调用它的一个方法时才会失败(导致对象自身加载)

因此,为了尝试确定资源是否有效,我将执行以下操作:

PersistedResult r = null;

if (!StringUtils.isEmpty(resultKey)) {
    try {
       r = mFactory.getPersistedResult(resultKey);
       r.getResultCount(); // Triggers exception if result key was invalid.    
    } catch (Exception e) {
       // handle exception
    }
 }
我对
getResultCount
的调用是否有被优化的风险,因为我没有使用该值?

PersistedResult
上调用任何方法都会转到外部数据库,以防万一


谢谢

不,为什么会这样?
getResultCount
不会内联,在这种情况下,它是一个黑盒,必须执行,因为它可以做任何事情;或者它将内联,在这种情况下,编译器可以看到它可能引发异常,并将执行该操作


它有一个返回值这一事实并不重要。如果这是一个因素,那么如果调用方不检查其返回值,那么任何复杂的函数都有被优化的风险。

编译器不能假设getResultCount()没有副作用——因此它不能删除调用。

运行时优化(或编译时优化,相同)不允许提供与未优化任何内容时不同的结果(除了运行时或内存节省)。如果您的异常不是因为优化而抛出的,那么这肯定是另一种行为,因此将是一个bug


(注意,与多线程环境相比,在考虑不同线程之间的关系时,这有点轻松。)

否。因为优化无法更改代码的语义。

这是我不确定的。。。Java中的死代码消除到底有多贪婪?这些方法上没有已检查的异常。。。它们都是运行时异常。同样,不确定这是否重要?try-catch是否仅限于r.getResultCount?它并没有那么简单。虽然它不能假设这一点,但它可以在理论上证明它没有副作用。但另一点是,副作用可能包括抛出异常,或其他可能对程序结果产生明显影响的事情。为了学究气,这里的原始海报明确指出getResultCount()确实有副作用。因此,如果编译器足够聪明,能够做这样的证明,它就会得出正确的结论。换句话说,如果它不够聪明去做这些,那么它做出这个假设是错误的。万斯,谢谢,是的,这就是我的假设,我只是想确定一下。死代码消除似乎是一种非常危险的优化技术,因为似乎大多数代码都有可能产生副作用。我真的不知道JVM/javac是如何确定哪些有副作用,哪些没有副作用。@Polaris878“死代码”是被确定为无法通过正常方式访问的代码,而不是带有未使用值的代码。e、 g.
if(false){/*这里的所有内容都将被视为死代码*/}