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

时间:2017-07-19 12:20:33

标签: java eclipse assertion design-by-contract

我有以下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(!)。目前不支持更新到任何一个版本的新版本。

1 个答案:

答案 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类中的一个对象。