我有以下一段Java代码:
public void silence(final Object key) {
final Chain chain = (Chain)getChain(key);
checkPrecondition(chain != null);
chain.silence();
}
如果链为空,则 checkPrecondition 调用会引发运行时异常,但 Eclipse 似乎没有"得到这个":它说 chain.silence(( 是一个可能的空指针访问(警告(。 问:我怎样才能"告诉"Eclipse,checkPrecondition(( 确保链不为空,即具有断言的特征?我知道我可以禁用此警告,但我宁愿不这样做,因为在其他情况下,这可能是合理的。
有趣的是,当我删除 checkPrecondition(( 调用时,警告消失了(这正是我希望看到它的情况(。
我在Windows上使用Eclipse 4.4.2(32位(。Java VM 是 1.3 (!(。目前无法更新到任一版本的较新版本。
你不要告诉 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 类中的一个对象。