如何配置 Eclipse (Java) 以在检查潜在的空指针时识别自定义断言



我有以下一段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 类中的一个对象。

相关内容

  • 没有找到相关文章

最新更新