我有以下Java代码:
public void silence(final Object key) {
final Chain chain = (Chain)getChain(key);
checkPrecondition(chain != null);
chain.silence();
}
如果chain为null,checkPrecondition调用会引发运行时异常,但Eclipse似乎并没有“得到这个”:它表示chain.silence()是一个可能的空指针访问(警告)。 问题:如何“告诉”Eclipse checkPrecondition()确保链不为空,即具有断言的特征?我知道我可以禁用此警告,但我宁愿不这样做,因为在其他情况下,它可能是合理的。
有趣的是,当我删除checkPrecondition()调用时,警告消失了(这正是我希望看到的情况)。
我在Windows上使用Eclipse 4.4.2(32位)。 Java VM是1.3(!)。目前不支持更新到任何一个版本的新版本。
答案 0 :(得分:0)
你不告诉Eclipse,你必须用这样的语法和逻辑生成代码,以便Java编译器能够成功编译并且JVM能够执行。
发生运行时异常是正常的。变量值只能在运行时检查,对于空指针也是如此(事实上几乎每种语言都假装来自C并使用与指针相关的东西,而且在C之前已经是这种情况)。
您可以使用两种不同的方法解决此问题,具体取决于您的风格和您的项目中使用的风格。
首先是防御方式 - >你认为这个子程序 应该在发生这样的错误之前被杀死(空指针错误 在软件行业花了很多钱。)
public void silence(final Object key) {
if (key == null) {
throw new IllegalArgumentException("Key should not be null.");
}
Object oChain = getChain(key);
if (oChain == null || !(oChain instanceof Chain)) {
throw new IllegalArgumentException("Key should be mapped to an object from the Chain class type.");
}
Chain chain = (Chain)oChain;
if(checkPrecondition(chain)) {
chain.silence();
}
}
第二种方式是冒犯性的:调用代码应该处理这个并且子进程不必崩溃任何东西!
public boolean silence(final Object key) {
if (key == null) return false;
Object oChain = getChain(key);
if (oChain == null || !(oChain instanceof Chain)) return false;
Chain chain = (Chain)oChain;
if(!checkPrecondition(chain)) return false;
chain.silence();
return true;
}
请注意我认为 checkcondition 方法返回一个布尔值,其单个参数应该是Chain类中的一个对象。