在Java中避免NullPointerException的解决方案

作者:python之恋 时间:2023-10-17 04:47:00 

object != null要避免很多NullPointerException

有什么替代方法:


if (someobject != null) {
   someobject.doCalc();
}

解决方案:

在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null。另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值。

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

  1. 如果为null,则表示合同中的有效回复;和

  2. 如果不是有效的回应。

(2)容易。使用assert语句(断言)或允许失败(例如NullPointerException)。断言是1.4中新增的一个未被广泛使用的Java功能。语法为:


assert <condition>

或者


assert <condition> : <object>

where<condition>是一个布尔表达式,<object>是一个对象,其toString()方法的输出将包含在错误中。

一个assert语句抛出一个ErrorAssertionError如果条件是不正确的)。默认情况下,Java会忽略断言。您可以通过将选项传递-ea给JVM来启用断言。您可以启用和禁用单个类和程序包的断言。这意味着尽管我的测试几乎没有显示断言对性能的影响,但是您可以在开发和测试时使用断言来验证代码,并在生产环境中禁用它们。

在这种情况下,不使用断言是可以的,因为代码只会失败,这就是使用断言时会发生的情况。唯一的区别是,有了断言,它可能会更早地发生,以更有意义的方式出现,并可能带有额外的信息,这可以帮助您弄清楚为什么它出乎意料。

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

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

使用非集合,可能会更困难。以这个为例:如果您具有以下接口:


public interface Action {
 void doSomething();
}

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

在Parser中,原始的用户输入会找到要执行的操作,也许是在您实现某项功能的命令行界面时。现在,如果没有适当的操作,您可以使合同返回null。这将导致您正在谈论的空检查。

另一种解决方案是从不返回null,而使用Null Object模式:


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()方法来说,抛出带有有意义的错误消息的Exception异常是完全适当的-特别是在这种情况下,您依赖于用户输入。对于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);
       }
   }
}

本文首发于java黑洞网,博客园同步更新

来源:https://www.cnblogs.com/pythonzhilian/archive/2021/04/14/14657764.html

标签:Java,NullPointerException
0
投稿

猜你喜欢

  • 浅析Java常用API(Scanner,Random)匿名对象

    2023-05-04 09:42:39
  • springBoot集成Elasticsearch 报错 Health check failed的解决

    2022-12-07 05:18:16
  • C#中将ListView中数据导出到Excel的实例方法

    2023-12-07 04:00:08
  • spring validation多层对象校验教程

    2023-11-27 15:17:49
  • Android操作Excel文件的功能实现

    2022-08-29 17:22:55
  • git工作区和暂存区_动力节点Java学院整理

    2022-06-27 20:31:06
  • Java 中ThreadLocal类详解

    2022-01-31 19:58:17
  • 10k+点赞的 SpringBoot 后台管理系统教程详解

    2021-08-11 14:39:44
  • Android实现拍照或者选取本地图片

    2022-06-16 03:58:31
  • Spring Cache框架应用介绍

    2023-06-15 22:32:59
  • C#发送邮箱实现代码

    2022-04-16 11:57:57
  • Android使用gallery和imageSwitch制作可左右循环滑动的图片浏览器

    2021-08-31 22:49:45
  • android 修改launcher行数和列数的方法

    2021-10-02 14:19:37
  • C#11新特性使用案例详解

    2023-11-26 03:19:15
  • Java 方法的重载与参数传递详解

    2023-10-19 18:50:46
  • java gui详解贪吃蛇小游戏实现流程

    2023-10-08 07:12:24
  • 解决Android ListView数据为空及加载错误的方法

    2022-11-30 06:57:41
  • Struts2实现文件上传功能实例解析

    2023-11-04 04:56:13
  • Java 前台加后台精品图书管理系统的实现

    2023-10-23 04:06:47
  • 浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    2023-11-20 09:26:40
  • asp之家 软件编程 m.aspxhome.com