当应用程序试图null在需要对象的情况下使用时抛出。这些包括:

  1. 调用null对象的实例方法。
  2. 访问或修改null对象的字段。
  3. 把长度null当作一个数组。
  4. 像访问或修改null阵列一样访问或修改插槽。
  5. 投掷null就好像它是一个Throwable 价值。
  6. 应用程序应该抛出此类的实例来指示null对象的其他非法使用。
  7. NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样。

为什么我们需要空值?

  1. 如前所述,nullJava是一种特殊的值。
  2. 它在编码某些设计模式(如空对象模式和单例模式)时非常有用。
  3. 空对象模式提供了一个对象作为缺少给定类型对象的代理。
  4. Singleton模式确保只创建一个类的一个实例,并且旨在提供对象的全局访问点。

例如,最多创建一个类实例的示例方法是将其所有构造函数声明为private,然后创建一个返回该类的唯一实例的公共方法:

TestSingleton.java:

  1. import java.util.UUID;
  2.  
  3. class Singleton {
  4.  
  5. private static Singleton single = null;
  6. private String ID = null;
  7.  
  8. private Singleton() {
  9. /* Make it private, in order to prevent the creation of new instances of
  10. * the Singleton class. */
  11.  
  12. ID = UUID.randomUUID().toString(); // Create a random ID.
  13. }
  14.  
  15. public static Singleton getInstance() {
  16. if (single == null)
  17. single = new Singleton();
  18.  
  19. return single;
  20. }
  21.  
  22. public String getID() {
  23. return this.ID;
  24. }
  25. }
  26.  
  27. public class TestSingleton {
  28. public static void main(String[] args) {
  29. Singleton s = Singleton.getInstance();
  30. System.out.println(s.getID());
  31. }
  32. }

在这个例子中,我们声明了一个Singleton类的静态实例。该实例在该getInstance方法内最多初始化一次。注意使用null启用唯一实例创建的值。

如何避免NullPointerException

为了避免这种情况NullPointerException,请确保在使用它们之前,所有对象都已正确初始化。注意,当你声明一个引用变量时,你真的创建了一个指向对象的指针。在向对象请求方法或字段之前,您必须验证指针是否为空。

另外,如果引发异常,请使用驻留在异常堆栈跟踪中的信息。执行的堆栈跟踪由JVM提供,以启用应用程序的调试。找到捕获异常的方法和行,然后确定哪个引用等于在特定行中为null。

在本节的其余部分中,我们将介绍一些处理上述例外的技术。但是,它们并没有消除这个问题,程序员在编写应用程序时应该小心。

1.字符串与文字的比较 
应用程序执行代码中的一个非常常见的情况涉及字符串变量和文字之间的比较。文字可以是一个字符串或Enum的元素。不要从空对象调用方法,而应考虑从文字中调用它。例如,观察以下情况:

  1. String str = null;
  2. ifstr.equals(“Test”)){
  3. / *这里的代码将不会被触发,因为会抛出异常。* /
  4. }

上面的代码片段会抛出一个NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:

  1. String str = null;
  2. if(“Test”.equalsstr)){
  3. / *正确的用例。不会抛出异常。* /
  4. }

2.检查方法的参数 
在执行你自己的方法的主体之前,一定要检查它的参数为空值。只有在正确检查了参数后,才继续执行该方法。否则,您可以抛出一个IllegalArgumentException并通知调用方法传递的参数有问题。

例如:

  1. public static int getLengthString s){
  2. 如果(s == null
  3. 抛出新的IllegalArgumentException(“参数不能为空”);
  4.  
  5. return s.length();
  6. }

3.优先使用String.valueOf()方法代替toString() 
当您的应用程序代码需要对象的字符串表示形式时,请避免使用该对象的toString方法。如果你的对象的引用等于null,NullPointerException则会抛出a。

相反,考虑使用静态String.valueOf方法,该方法不会抛出任何异常并打印”null”,以防函数的参数等于null。

4.使用三元运算符 
该ternary操作是非常有用的,可以帮助我们避免了NullPointerException。运营商的形式是:

  1. 布尔表达式?value1value2;

首先,评估布尔表达式。如果表达式为true,则返回value1,否则返回value2。我们可以使用ternary运算符来处理空指针,如下所示:

  1. String message =(str == null)?""str.substring010);

如果str引用为空,则消息变量将为空。否则,如果str指向实际数据,则消息将检索它的前10个字符。

5.创建返回空集合而不是null的方法 
一个非常好的技术是创建返回一个空集合的方法,而不是一个null值。你的应用程序的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个NullPointerException。例如:

Example.java

  1. public class Example {
  2. private static List<Integer> numbers = null;
  3.  
  4. public static List<Integer> getList() {
  5. if (numbers == null)
  6. return Collections.emptyList();
  7. else
  8. return numbers;
  9. }
  10. }

6.使用Apache的StringUtils类 
Apache的Commons Lang是一个为java.langAPI 提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是StringUtils.java,它null静静地处理输入字符串。

你可以使用StringUtils.isNotEmpty, StringUtils.IsEmpty和StringUtils.equals方法,以避免NullPointerException。例如:

  1. ifStringUtils.isNotEmptystr)){
  2. System.out.printlnstr.toString());
  3. }

7.使用contains(),containsKey(),containsValue()方法 
如果您的应用程序代码使用集合,例如Maps考虑使用包含containsKey和containsValue方法。例如,在地图中验证其存在之后,检索特定键的值:

  1. Map <StringString> map = ...
  2. ...
  3. String key = ...
  4. String value = map.getkey);
  5. System.out.printlnvalue.toString()); //如果值为null,则会抛出异常。

在上面的代码片段中,我们不检查密钥是否真的存在于内部Map,因此返回的值可以是null。最安全的方法如下:

  1. Map <StringString> map = ...
  2. ...
  3. String key = ...
  4. ifmap.containsKeykey)){
  5. String value = map.getkey);
  6. System.out.printlnvalue.toString()); //不会抛出异常。
  7. }

8.检查外部方法的返回值 
在实践中使用外部库是很常见的。这些库包含返回引用的方法。确保返回的参考不是null。另外,请考虑阅读该方法的Javadoc,以便更好地理解其功能和返回值。

9.使用断言 
断言在测试代码时非常有用,并且可以被使用,以避免执行代码片断,从而导致错误NullPointerException。Java断言是用assert关键字实现的,并抛出一个AssertionError。

请注意,您必须显式启用JVM的断言标志,方法是使用–ea参数执行该标志。否则,断言将被完全忽略。

使用Java断言的示例示例如下:

  1. public static int getLengthString s){
  2. / *确保String不为null。* /
  3. asserts!= null);
  4.  
  5. return s.length();
  6. }

如果您执行上面的代码段并传递一个空参数getLength,则会出现以下错误消息:

  1. Exception in thread "main" java.lang.AssertionError

最后,您可以使用测试框架Assert提供的类jUnit。

10.单元测试 
在测试代​​码的功能和正确性时,单元测试可能非常有用。花一些时间编写一些测试用例,验证NullPointerException应用程序的代码是否经历了特定的执行流程,否则将引发no 。

现有的NullPointerException安全方法

1.访问类的静态成员或方法 
当你的代码试图访问静态变量或类的方法时,即使对象的引用等于null,JVM也不会抛出一个NullPointerException。这是由于Java编译器在编译过程中将静态方法和字段存储在特殊位置。因此,静态字段和方法不与对象相关联,而与类的名称相关联。

例如,下面的代码不会抛出NullPointerException:

TestStatic.java:

  1. class SampleClass {
  2.  
  3. public static void printMessage(){
  4. System.out.println(“Hello Java Geeks!”);
  5. }
  6. }
  7.  
  8. public class TestStatic {
  9. public static void mainString [] args){
  10. SampleClass sc = null;
  11. sc.printMessage();
  12. }
  13. }

注意,尽管SampleClass等于的实例null将会被正确执行。但是,对于静态方法或字段,最好以静态方式访问它们,比如SampleClass.printMessage()。

2.运营商的instanceof 
instanceof即使对象的引用等于,也可以使用该运算符null。在instanceof操作时,参考值等于为null,不抛出一个返回false NullPointerException。例如,考虑下面的代码片段:

  1. String str = null;
  2. if(str instanceof String)
  3. System.out.println("It's an instance of the String class!");
  4. else
  5. System.out.println("Not an instance of the String class!");

正如预期的那样,执行的结果是:

  1. Not an instance of the String class!

这是一篇关于如何处理Java的教程NullPointerException。

java.lang.NullPointerException - 如何处理空指针异常的更多相关文章

  1. java 空指针异常(java.lang.NullPointerException)

    在Java中对值为null的指针调用任何方法,就会引发空指针异常(java.lang.NullPointerException).空指针异常绝对 是Java中最难查找和调试的一种异常,你永远无法得到任 ...

  2. java.lang.NullPointerException 错误原因

    [http-nio-8081-exec-1] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] - Servlet.service() for ...

  3. 空指针问题(java.lang.NullPointerException)

    在Java中对值为null的指针调用任何方法,就会引发空指针异常(java.lang.NullPointerException).空指针异常绝对是Java中最难查找和调试的一种异常,你永远无法得到任何 ...

  4. Scala操作Hbase空指针异常java.lang.NullPointerException处理

    Hbase版本:Hortonworks Hbase 1.1.2 问题描述:使用Scala操作Hbase时,发生空指针异常(java.lang.RuntimeException: java.lang.N ...

  5. java.lang.NullPointerException 空指针异常问题

    java.lang.NullPointerException 空指针异常问题: 空指针异常抛出的异常信息一般是: Exception in thread "main" java.l ...

  6. 解决spark dataframe get 报空指针异常 java.lang.NullPointerException

    Spark 编程读取hive,hbase, 文本等外部数据生成dataframe后,一般我们都会map遍历get数据的每个字段,此时如果原始数据为null时,如果不进行判断直接转化为string,就会 ...

  7. 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null

    大家在项目测试过程中,是不是经常会碰到这个空指针异常呢Caused by: java.lang.NullPointerException: null 当大家遇到这个问题,大家是怎么处理?自己解决还是让 ...

  8. 【零碎小bug系列】安卓开发是遇到空指针异常java.lang.NullPointerException: Attempt to invoke...

    安卓开发是遇到空指针异常 java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable ...

  9. Servlet.service() for servlet UserServlet threw exception java.lang.NullPointerException 空指针异常

    错误付现: 严重: Servlet.service() for servlet UserServlet threw exceptionjava.lang.NullPointerException at ...

随机推荐

  1. GitHub + circleCI 自动构建/自动部署 应用

    GitHub + circleCI 自动构建/自动部署, 这里略过了单元测试,以部署 laravel 应用为例子 比起 gitlab + ansible + genkins 操作起来节省了很多硬件资源 ...

  2. 百度地图JavaScript如何清除指定类型的覆盖物

    由于一个地图中有很多种类型的覆盖物,由于某个覆盖物(一般是自定义)整个地图中只允许出现一次 那第一想到的就是,每次创建这个类型的覆盖物时先清除这一类型的覆盖物,比较简单判断覆盖物的类型 instanc ...

  3. typedef与前向声明

    a.h: typedef struct my_struct { }my_struct_typedef; b.h: struct my_struct; typedef my_struct my_stru ...

  4. ie下 iframe在页面中显示白色背景 如何去掉的问题

    ie下:

  5. 初步认识AutoMapper

      AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常在一个应用程序中,我们开发 ...

  6. fio与dd测试结果记录

    以下测试基于win7内安装的vbox虚机内进行. vbox-vm挂载了7.2k disk作为本地系统盘,挂载了ssd 8G空间作为mount /mnt/data /dev/sdb 今天顺便了做个一个简 ...

  7. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4

    HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...

  8. 存储设备的DDP功能详解

    http://blog.csdn.net/u013394982/article/details/18259015 DDP功能,即Dynamic Disk Pool,它是除了现有的RAID0,1,10, ...

  9. [Python] numpy.logspace

    numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None) starting value  :=  base** ...

  10. 图解http pdf

    扫加公众号,回复“图解HTTP”,免费获取此书.