相关疑难解决方法(0)

避免!= null语句

我用object != null了很多东西来避免NullPointerException.

有没有一个很好的替代品呢?

例如:

if (someobject != null) {
    someobject.doCalc();
}
Run Code Online (Sandbox Code Playgroud)

NullPointerException当不知道对象是否存在时,这避免了a null.

请注意,接受的答案可能已过期,请参阅/sf/answers/167020941/以获取更新的方法.

java null object nullpointerexception

3904
推荐指数
42
解决办法
119万
查看次数

检索方法是否应返回'null'或在无法生成返回值时抛出异常?

我有一个方法,如果找到它,它应该返回一个对象.

如果找不到,我应该:

  1. 返回null
  2. 抛出一个例外
  3. 其他

error-handling null exception

490
推荐指数
11
解决办法
14万
查看次数

抛出ArgumentNullException

假设我有一个方法将某种对象作为参数.现在说如果这个方法传递一个null参数,那就是一个致命的错误,应该抛出一个异常.编写这样的代码对我来说是否值得(请记住这是一个简单的例子):

void someMethod(SomeClass x)
{
    if (x == null){
        throw new ArgumentNullException("someMethod received a null argument!");
    }

    x.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

或者,当它调用x.doSomething()时,依赖它抛出NullException是否安全?

其次,假设someMethod是一个构造函数,在调用另一个方法之前不会使用x.我应该立即抛出异常还是等到需要x然后抛出异常?

.net c# exception-handling exception

59
推荐指数
9
解决办法
6万
查看次数

如何显示方法是否可以返回null

在发布这个问题并阅读那个问题,我意识到知道一个方法是否应该返回null是非常重要的,或者如果这被认为是错误条件并且应该抛出异常.还有一个很好的讨论,何时返回'null'或抛出异常.

我正在写一个方法,我已经知道如果我想返回null或抛出异常,表达我的决定的最佳方式是什么,换句话说,记录我的合同?

我能想到的一些方法:

  • 在规格/文档中写下来(任何人都会阅读它吗?)
  • 使它成为方法名称的一部分(正如我在这里建议的那样)
  • 假设抛出异常的每个方法都不会返回null,并且每个执行'not'抛出的方法都可能返回null.

我主要讨论java,但它也可能适用于其他语言:为什么有一种正式的方式来表达是否会抛出异常(throws关键字)但是没有正式的方式来表达是否可能返回null?

为什么没有这样的东西:

public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
    return null; // this would lead to a compiler error!
}
Run Code Online (Sandbox Code Playgroud)

总结和结论

表达合同的方式有很多种:

  • 如果您的IDE支持它(作为IntelliJ),最好使用注释,@NotNull因为它对程序员可见,并且可用于自动编译时检查.Eclipse有一个插件可以添加对这些的支持,但它对我不起作用.
  • 如果这些不是一个选项,请使用类似Option<T>或的自定义类型NotNull<T>,这样可以增加清晰度并至少提高运行时检查.
  • 无论如何,在JavaDoc中记录合同永远不会伤害,有时甚至会有所帮助.
  • 除了我之外,没有人提出使用方法名来记录返回值的可空性,虽然它可能非常详细而且并不总是有用,但我仍然认为它有时也有其优点.

java null design-by-contract

45
推荐指数
2
解决办法
3万
查看次数

如何在getter链中跟踪NullPointerException

如果我在这样的调用中得到NullPointerException:

someObject.getSomething().getSomethingElse().
    getAnotherThing().getYetAnotherObject().getValue();
Run Code Online (Sandbox Code Playgroud)

我得到一个相当无用的异常文本,如:

Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)
Run Code Online (Sandbox Code Playgroud)

我发现很难找到实际上调用returend null,经常发现自己将代码重构为这样的东西:

Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();
Run Code Online (Sandbox Code Playgroud)

然后等待更具描述性的NullPointerException,告诉我要查找哪一行.

你们中的一些人可能认为连接getter是一种糟糕的风格,无论如何都应该避免,但我的问题是:我可以在不更改代码的情况下找到错误吗?

提示:我正在使用eclipse,我知道调试器是什么,但我无法弄清楚如何将它应用于问题.

我对答案的结论是:
有些答案告诉我,我不应该一个接一个地连接吸气剂,一些答案显示我如何调试我的代码,如果我不赞成这个建议.

我已经接受了一个答案,这个答案让我知道什么时候连接吸气剂:

  • 如果他们不能返回null,只要你喜欢就链接它们.不需要检查!= null,无需担心NullPointerExceptions(请注意链接仍然是demeter的法则,但我可以忍受)
  • 如果它们可能返回null,则不要永远不会链接它们,并对每个可能返回null的值执行空值检查

这使得对实际调试的任何好建议毫无用处.

java debugging getter nullpointerexception

26
推荐指数
4
解决办法
7765
查看次数