首页 > Java > 我用来避免有没有其他选择?x !=nullNullPointerException

我用来避免有没有其他选择?x !=nullNullPointerException

上一篇 下一篇

网友问题:
我用来避免.有没有其他选择?
x != nullNullPointerException

if (x != null) {
    // ...
}

分割线

网友回答:

如果您使用(或计划使用)像JetBrains IntelliJ IDEA,Eclipse或Netbeans这样的Java IDE,或者像findbugs这样的工具,那么你可以使用注释来解决这个问题。

基本上,你有和.@Nullable@NotNull

您可以在方法和参数中使用,如下所示:

@NotNull public static String helloWorld() {
    return "Hello World";
}

@Nullable public static String helloWorld() {
    return "Hello World";
}

第二个示例无法编译(在IntelliJ IDEA中)。

当您在另一段代码中使用第一个函数时:helloWorld()

public static void main(String[] args)
{
    String result = helloWorld();
    if(result != null) {
        System.out.println(result);
    }
}

现在 IntelliJ IDEA 编译器会告诉你检查是无用的,因为该函数永远不会返回。helloWorld()null

使用参数

void someMethod(@NotNull someParameter) { }

如果你写这样的东西:

someMethod(null);

这不会编译。

最后一个示例使用@Nullable

@Nullable iWantToDestroyEverything() { return null; }

这样做

iWantToDestroyEverything().something();

你可以肯定这不会发生。?

这是让编译器检查比平时更多的内容并强制你的合约更强大的好方法。不幸的是,并非所有编译器都支持它。

在IntelliJ IDEA 10.5及更高版本中,他们添加了对任何其他实现的支持。@Nullable@NotNull

请参阅博客文章更灵活且可配置的 @Nullable/@NotNull 注释

分割线

网友回答:

如果不允许空值

如果从外部调用您的方法,请从如下所示的内容开始:

public void method(Object object) {
  if (object == null) {
    throw new IllegalArgumentException("...");
  }

然后,在该方法的其余部分中,您将知道这不是 null。object

如果它是一个内部方法(不是 API 的一部分),只需记录它不能为 null,仅此而已。

例:

public String getFirst3Chars(String text) {
  return text.subString(0, 3);
}

但是,如果您的方法只是传递值,而下一个方法传递它等,则可能会出现问题。在这种情况下,您可能需要检查上述参数。

如果允许空

这真的取决于。如果发现我经常做这样的事情:

if (object == null) {
  // something
} else {
  // something else
}

所以我分支,做两件完全不同的事情。没有丑陋的代码片段,因为我真的需要根据数据做两件不同的事情。例如,我应该处理输入,还是应该计算一个好的默认值?


实际上,我很少使用成语“”。if (object != null && ...

如果您展示通常使用习语的示例,则为您提供示例可能会更容易。

分割线

网友回答:

对我来说,这听起来像是初级到中级开发人员在某些时候经常面临的一个相当普遍的问题:他们要么不知道,要么不信任他们正在参与的合约,并防御性地过度检查空值。此外,在编写自己的代码时,他们倾向于依靠返回 null 来指示某些内容,因此需要调用方检查 null。

换句话说,有两种情况会出现空检查:

  1. 如果 null 是合同方面的有效响应;和
  2. 它不是有效响应的地方。

(2)容易。从Java 1.7开始,您可以使用.(如果您坚持使用以前的版本,那么离子可能是一个不错的选择。Objects.requireNonNull(foo)assert

此方法的“正确”用法如下所示。该方法返回传递给它的对象,如果对象为 null,则抛出 a。这意味着返回值始终为非空值。该方法主要用于验证参数。NullPointerException

public Foo(Bar bar) {
    this.bar = Objects.requireNonNull(bar);
}

它也可以像离子一样使用,因为如果对象为 null,它会引发异常。在这两种用途中,都可以添加一条消息,该消息将显示在异常中。下面像断言一样使用它并提供消息。assert

Objects.requireNonNull(someobject, "if someobject is null then something is wrong");
someobject.doCalc();

通常,抛出特定异常(例如当值为 null 但不应该为 null 时)有利于抛出更一般的异常,例如 。这是 Java 库采用的方法;当参数不允许为空时,优先。NullPointerExceptionAssertionErrorNullPointerExceptionIllegalArgumentException

(1)有点难。如果你无法控制你正在调用的代码,那么你就会陷入困境。如果 null 是有效的响应,则必须检查它。

但是,如果确实是你控制的代码(通常是这种情况),那么情况就不同了。避免使用空值作为响应。使用返回集合的方法,这很容易:几乎总是返回空集合(或数组)而不是 null。

对于非集合,它可能更难。以这个为例:如果您有以下接口:

public interface Action {
  void doSomething();
}

public interface Parser {
  Action findAction(String userInput);
}

解析器接受原始用户输入并找到要做的事情,也许如果您正在为某些内容实现命令行界面。现在,如果没有适当的操作,则可以将返回的协定设为 null。这会导致您正在谈论的空检查。

另一种解决方案是永远不返回 null,而是使用 Null 对象模式:

public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };

  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }
}

比较:

Parser parser = ParserFactory.getParser();
if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
  // do nothing
} else {
  action.doSomething();
}

ParserFactory.getParser().findAction(someInput).doSomething();

这是一个更好的设计,因为它会导致更简洁的代码。

也就是说,也许 findAction() 方法抛出带有有意义的错误消息的异常是完全合适的——尤其是在您依赖用户输入的情况下。对于findAction方法来说,抛出一个异常比调用方法用一个简单的NullPointerException而没有解释要好得多。

try {
    ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());
}

或者,如果您认为 try/catch 机制太丑陋,而不是“不执行任何操作”,则默认操作应向用户提供反馈。

public Action findAction(final String userInput) {
    /* Code to return requested Action if found */
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: " + userInput);
        }
    }
}

模板简介:该模板名称为【我用来避免有没有其他选择?x !=nullNullPointerException】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 674次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-08
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
自适应 微信模板 微信图片 单页式简历模板 微信文章 html5 微信素材 响应式 企业网站 微信公众平台
您可能会喜欢的其他模板