我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在Java中避免NullPointerException的解决方案

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在Java中避免NullPointerException的解决方案

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() {  }
  };

  public Action findAction(String userInput) {
    // ...
    if (  ) {
      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) {
    
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: " + userInput);
        }
    }
}

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

到此这篇关于在Java中避免NullPointerException的解决方案的文章就介绍到这了,更多相关Java中避免NullPointerException内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在Java中避免NullPointerException的解决方案

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Java中避免出现NullPointerException

今天就跟大家聊聊有关如何在Java中避免出现NullPointerException,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java中避免NullPointerExceptio
2023-05-31

Java 中 NullPointerException 的完美解决方案

在 Java 中,NullPointerException 是一种常见的运行时异常,它表示一个对象引用为 null,而尝试使用该对象引用调用方法或访问其属性。解决 NullPointerException 的最佳方案是遵循以下几个步骤:1.
2023-09-22

详解Java中NullPointerException异常的原因以及解决方法

NullPointerException是Java中常见的异常之一,通常是在运行时发生的。该异常表示程序试图访问一个空对象的属性或调用空对象的方法。造成NullPointerException异常的原因主要有以下几种:1. 对象引用为nul
2023-08-11

PHP PDO常见错误及解决方案:避免开发中的陷阱

在使用 PHP PDO 进行数据库操作时,经常会遇到各种各样的错误。这些错误不仅会影响程序的正常运行,还可能导致安全问题。因此,了解常见的 PDO 错误及解决方案非常重要。
PHP PDO常见错误及解决方案:避免开发中的陷阱
2024-02-13

在Java版的OkHttp3 中 RequestBody.create() 过时解决方案

当使用下面的代码时会提示 RequestBody.create() 已过时。 RequestBody rb = RequestBody.create(MediaType.parse("application/json; charset=ut
2023-08-16

python中dict避免key不存在的方法

这篇文章主要介绍python中dict避免key不存在的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、通过in判断key是否存在 >>> Thomas in d False2、通过dict提供的get()
2023-06-15

java中ThreadLocal避免线程不安全的方法

这篇文章主要介绍java中ThreadLocal避免线程不安全的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、说明ThreadLocal 翻译是线程本地变量的意思, ThreadLocal 就是用来创建线程的
2023-06-15

C++技术中的内存管理:有效避免内存泄漏的解决方案是什么?

c++++ 内存管理常见陷阱:内存泄漏,会导致应用程序崩溃。避免内存泄漏的解决方案:使用智能指针自动管理内存。运用 raii 资源管理技术确保对象超出作用域后释放资源。正确使用 new 和 delete 进行手动内存管理,释放内存时使用 d
C++技术中的内存管理:有效避免内存泄漏的解决方案是什么?
2024-05-07

java中IO流乱码的原因与避免方法

IO流读写中可能会出现乱码的原因:①编码和解码规则不一致②这个字符编码不支持某种语言(ex:中文)避免出现乱码的方法:1、编码 : String - byte[]String中有对应的方法:①:byte[] getBytes() : 使用平台的默认字符集
java中IO流乱码的原因与避免方法
2017-10-14

Java中避免出现死锁的方法有哪些

今天就跟大家聊聊有关Java中避免出现死锁的方法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。避免死锁的技术:1.加锁顺序2.加锁时限3.死锁检测加锁顺序当多个线程需要相同的一
2023-05-31

Android高效加载大图、多图解决方案 有效避免程序OOM

本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 http://developer.android.com/training/displaying-bitmaps/index.html高
2022-06-06

java中找不到符号的解决方案

这篇文章主要介绍了java中找不到符号的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-12

Java中避免写嵌套if样式的代码详解

前言Optional的代码相对更加简洁,当代码量较大时,我们很容易忘记进行null判定,但是使用Optional类则会避免这类问题。下面这是一个嵌套的 if 判断,业务逻辑是从 httpRequst 中获取 X-Auth-Token 的值。
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录