Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何配置Eclipse(Java)在检查潜在的空指针时识别自定义断言_Java_Eclipse_Assertion_Design By Contract - Fatal编程技术网

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

如何配置Eclipse(Java)在检查潜在的空指针时识别自定义断言,java,eclipse,assertion,design-by-contract,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,则checkPremission调用会引发运行时异常,但Eclipse似乎没有“得到这个”:它说chain.silence()可能是null指针访

我有以下一段Java代码:

public void silence(final Object key) {
    final Chain chain = (Chain)getChain(key);
    checkPrecondition(chain != null);
    chain.silence();
  }
如果chain为null,则checkPremission调用会引发运行时异常,但Eclipse似乎没有“得到这个”:它说chain.silence()可能是null指针访问(警告)。 问题:我如何“告诉”Eclipse checkPremission()确保链不为null,即具有断言的特征?我知道我可以禁用此警告,但我不希望这样做,因为在其他情况下,它可能是合理的

有趣的是,当我删除checkPremission()调用时,警告消失了(这正是我希望看到的情况)


我在Windows上使用Eclipse4.4.2(32位)。JavaVM是1.3(!)。更新到这两个版本的较新版本目前都不是一个选项。

您不必告诉Eclipse,您必须以Java编译器将成功编译并使JVM能够执行的语法和逻辑生成代码

发生运行时异常是正常的。只能在运行时检查变量值,空指针也是如此(事实上,几乎所有假装来自C并使用与指针相关的东西的语言都是如此,在C之前就已经是这样了)

您可以使用两种不同的方法解决此问题,具体取决于您的风格和项目中使用的方法

    首先是防御方式->你认为子程序 应在发生此类错误之前终止(空指针错误 在软件行业成本很高)

  • 第二种方法是攻击性的:调用代码应该处理这个问题,子进程不必崩溃任何东西

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

无关:因为您担心代码质量。。。考虑一下你是否真的想遵循那种“处处”的丑陋方法。如果链是最终的,则此方法的值为零。在这种情况下,使用“final”的好处是有限的,但也没有成本。因此,完全没有损失。在其他上下文中,“final”的使用传达了程序员的意图,并且可能导致在编译时检测到编码错误,而不是通过繁琐的测试。我们的编码准则明确要求使用“final”,我所见过的大多数现代和严肃的编码准则也是如此。效益很高!正因为如此,Java语言的研究人员投入了宝贵的时间来改进编译器,以有效地检测最终变量-这样您就不必为以后不会更改的局部变量写下最终变量;-)。。。正如你让我好奇的那样:你能给出一些例子链接吗?我感谢你花时间回复,非常感谢。然而,我真的看不到我的问题的答案。问题是,当checkPremission()调用就位时,Eclipse会抱怨,即使没有问题(处理了null大小写)。如果调用不到位,则会出现问题(未处理null案例),但Eclipse不会抱怨。在我们的案例中,增加代码大小,使之实质上符合上述要求不是一种选择。另一方面,您的提示不仅要检查null,还要检查“instanceof”。我对“tell Eclipse”的意思是:例如,PC lint允许我声明某个自定义表达式的行为类似于断言,并且在静态代码分析期间应被视为“assert”的同义词。这很有意义,这就是我在Eclipse中所寻找的。我知道您很困惑,但您的代码似乎根本无法编译(尤其是checkpremission调用,因为您在等待另一个类型的地方传递布尔值,至少我希望如此)。通常,您不会试图修改Eclipse Linter,这可能是您将获得的最大帮助之一(背后的人都是非常优秀的程序员,您可以信任他们)。如果你这样做了,你就不再需要Eclipse了。更新代码比修改Eclipse本身要简单得多:想象一下在项目中每次更新或新到达时修改Linter。
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;
}