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

NullPointerException是当您尝试使用指向内存中空位置的引用(null)时发生的异常,就好像它引用了一个对象一样。

当我们声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,您可以在其中声明基本类型的整型变量x:

int x;
x = 10;

在此示例中,变量x是一个整型变量,Java将为您初始化为0。当您在第二行中将其分配给10时,值10将被写入x指向的内存中。

但是,当您尝试声明引用类型时会发生不同的事情。请使用以下代码:

Integer num;
num = new Integer(10);

第一行声明了一个名为的变量num,但它不包含原始值。相反,它包含一个指针(因为类型Integer是一个引用类型)。既然你还没有说什么指向Java,它将它设置为null,意思是“ 我什么都没有指向”。

在第二行中,new关键字用于实例化(或创建)Integer类型的对象,并为指针变量num分配此对象。您现在可以使用解引用运算符.(点)来引用对象。

在当你声明了一个变量,但是没有创建一个对象,会发生Exception。如果您在创建num对象之前尝试取消引用,则会得到一个NullPointerException。在最琐碎的情况下,编译器将捕获问题并让您知道“num可能尚未初始化”,但有时您编写的代码不会直接创建对象。

例如,您可能使用了如下的方法:

public void doSomething(SomeObject obj) {
  //do something to obj
}

在这种情况下,您没有创建对象obj,而是假设它是在doSomething调用方法之前创建的。如果你像这样调用方法:

doSomething(null);

在这种情况下obj为null。如果该方法旨在对传入的对象执行某些操作,则需要抛出异常,因为NullPointerException它是程序错误,程序员将需要该信息用于调试的目的。

或者,可能存在这样的情况:该方法的目的不仅仅是对传入的对象进行操作,因此可以接受空参数。在这种情况下,您需要检查null参数并采取不同的行为。您还应该在文档中解释这一点。例如,doSomething应该最好写成:

/**
 * @param obj An optional foo for ____. May be null, in which case
 * the result will be ____.
 */
public void doSomething(SomeObject obj) {
  if(obj != null) {
    //do something
  } else {
    //do something else
  }
}

我如何解决它?

所以你有一个NullPointerException。应该如何解决?让我们举一个简单的例子,它抛出NullPointerException:

public class Printer {
  private String name;

  public void setName(String name) {
    this.name = name;
  }

  public void print() {
    printString(name);
  }

  private void printString(String s) {
    System.out.println(s + " (" + s.length() + ")");
  }

  public static void main(String[] args) {
    Printer printer = new Printer();
    printer.print();
  }
}

标识空值

第一步是确切地确定导致异常的值。为此,我们需要做一些调试。学习阅读堆栈跟踪很重要。这将显示抛出异常的位置:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

在这里,我们看到在第13行抛出异常(在printString方法中)。查看该行并通过添加日志记录语句或使用调试器来检查哪些值为空。我们发现它s是null,并且调用length方法会抛出异常。我们可以看到程序在s.length()方法中删除时停止抛出异常。

追踪这些值来自哪里

接下来检查此值的来源。按照该方法的调用者,我们可以看到,s与传递printString(name)的print()方法,并this.name为空。

跟踪应设置这些值的位置

在哪里this.name设置?在setName(String)方法中。通过一些更多的调试,我们可以看到根本没有调用此方法。如果调用该方法,请确保检查调用这些方法的顺序,并且在print方法之后不调用set 方法。

这足以为我们提供一个解决方案:在调用printer.setName()之前添加调用printer.print()。

其他修正

该变量可以具有默认值(并且setName可以防止将其设置为null):

private String name = "";

任一print或printString方法可以检查空,例如:

printString((name == null) ? "" : name);

或者您可以设计如下所示的类,以便name 始终具有非null值:

public class Printer {
  private final String name;

  public Printer(String name) {
    this.name = Objects.requireNonNull(name);
  }

  public void print() {
    printString(name);
  }

  private void printString(String s) {
    System.out.println(s + " (" + s.length() + ")");
  }

  public static void main(String[] args) {
    Printer printer = new Printer("123");
    printer.print();
  }
}

到此这篇关于详解Java中NullPointerException异常的原因详解以及解决方法的文章就介绍到这了,更多相关Java NullPointerException异常内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-08-03

java.lang.NullPointerException 如何处理空指针异常的实现

当应用程序试图null在需要对象的情况下使用时抛出.这些包括: 调用null对象的实例方法. 访问或修改null对象的字段. 把长度null当作一个数组. 像访问或修改null阵列一样访问或修改插槽. 投掷null就好像它是一个Throwable 价值. 应用程序应该抛出此类的实例来指示null对象的其他非法使用. NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样. 为什么我们需要空值? 如前所述,nullJava是一种特殊的值. 它在编码某些

java.lang.NullPointerException出现的几种原因及解决方案

java.lang.NullPointerException出现的几种原因: 1.字符串变量未初始化 2.接口类型的对象没有用具体的类初始化,比如: Map map // 会报错 Map map = new Map(); //则不会报错了 3.当一个对象的值为空时,你没有判断为空的情况. 4.字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常 String str = null; if(str.equals("Test")){ //这里的代码将不会被触发,因为会抛

Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException解决办法: 利用Java操作XML,在操作XML过程中,执行到最后一步,在利用Transformer进行XML转换时出现NullPointerException错误,出问题的部分代码如下: //转换 TransformerFactory tFactory =TransformerFactory.newInstance(); Tr

Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法

当然这个东西很吃内存,配置差点的就不推荐使用了. 最近用的时候, 发现, 建立PHP工程后,再打开 Zend Studio for Eclipse就出现这个错误 An internal error occurred during: "Building PHP projects ..."java.lang.NullPointerException 很烦人的. 出错后PHP projects 会停止build,代码提示就全部没有了.需要手动rebuild. 今天在zend论坛找到一个解决办

java 避免出现NullPointerException(空指针)的方法总结

java 避免出现NullPointerException(空指针)的方法总结 Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键.俗话说"预防胜于治疗",对于这么令人讨厌的空指针异常,这句话也是成立的.值得庆幸的是运用一些防御性的编码技巧,跟踪应用中多个部分之间的联系,你可以将Java中的空指针异常控制在一个很好的水平上.顺便说一句,这是Javarevisited上的第二个空指针异常的帖子.在上个帖子中我们讨论了Java中导致空指针异常的常见原因

Android studio报: java.lang.ExceptionInInitializerError 错误

一.问题描述 Android studio导入一个项目报一堆错误: Process: xhs.com.xhswelcomeanim, PID: 1416 Java.lang.ExceptionInInitializerError at com.werb.gankwithzhihu.ui.fragment.ZhihuFragment.createPresenter(ZhihuFragment.java:33) at com.werb.gankwithzhihu.ui.fragment.ZhihuF

java.lang.ExceptionInInitializerError异常的解决方法

今天在开发的过程中,遇到java.lang.ExceptionInInitializerError异常,百度查了一下,顺便学习学习,做个笔记 静态初始化程序中发生意外异常的信号,抛出ExceptionInInitializerError表明在计算静态初始值或静态变量的初始值期间发生异常. 要理解这个异常从Java类中的静态变量初始化过程说起,在Java类中静态变量的初始化顺序和静态变量的声明顺序是一致的.示例程序为: package com.lang.ininitialException; im

java 出现NullPointerException的原因及解决办法

java 出现NullPointerException的原因及解决办法 日常开发过程中,最常见的异常莫过于NullPointerException,之前的时候,只是知道去找到报错的位置,然后去解决它,最近有空学习C语言,就去深究了下NullPointerException异常的本质. 发生NullPointerException的情况: 调用 null 对象的实例方法. 访问或修改 null 对象的字段. 如果一个数组为null,试图用属性length获得其长度时. 如果一个数组为null,试图

java.lang.Void类源码解析

在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code null} * @throws SecurityException if the current thread cannot create a * thread in the specified thread group. */ private static Void checkParentAcc