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

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

日常开发过程中,最常见的异常莫过于NullPointerException,之前的时候,只是知道去找到报错的位置,然后去解决它,最近有空学习C语言,就去深究了下NullPointerException异常的本质。

发生NullPointerException的情况:

  • 调用 null 对象的实例方法。
  • 访问或修改 null 对象的字段。
  • 如果一个数组为null,试图用属性length获得其长度时。
  • 如果一个数组为null,试图访问或修改其中某个元素时。
  • 在需要抛出一个异常对象,而该对象为 null 时。

首先,我们先找到Java.lang.NullPointerException这个类,内容很简单:

package java.lang;

/**
 * Thrown when a program tries to access a field or method of an object or an
 * element of an array when there is no instance or array to use, that is if the
 * object or array points to {@code null}. It also occurs in some other, less
 * obvious circumstances, like a {@code throw e} statement where the {@link
 * Throwable} reference is {@code null}.
 */
public class NullPointerException extends RuntimeException {

  private static final long serialVersionUID = 5162710183389028792L;

  /**
   * Constructs a new {@code NullPointerException} that includes the current
   * stack trace.
   */
  public NullPointerException() {
  }

  /**
   * Constructs a new {@code NullPointerException} with the current stack
   * trace and the specified detail message.
   *
   * @param detailMessage
   *      the detail message for this exception.
   */
  public NullPointerException(String detailMessage) {
    super(detailMessage);
  }

}

NullPointerException翻译过来便是空指针,接下来我们首先要了解的是什么是指针,对于非C/C++的程序员来说,很多其它语言开发者对指针的概念很模糊,说白了,指针就是存储变量的内存地址,在c语言里面,NULL表示该指针不指向任何内存单元,0表示指向地址为0的单元(这个单元一般是不能使用的)。先看一段C语言代码:

void main() {
  int* i = NULL;
  printf("%#x\n", i);
  printf("%#x\n", &i);
  system("pause");
}

在C语言里,你可以读取NULL本身的值(void *)0,即0,但是读取它指向的值,那是非法的,会引发段错误。而Java里面的NULL就是直接指向了0,上述也说了,指向地址为0的单元,一般是不能使用的。

一句话总结:因为指向了不可使用的内存单元,虚拟机无法读取它的值,最终导致NullPointerException。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-08-28

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中导致空指针异常的常见原因

Java中避免NullPointerException的方法总结

Java中避免NullPointerException的方法总结 在字符串常量上调用equals // good "string literal".equals(strObject) // not good strObject.equals("string literal") 如果strOject == null,那下面一种方法就会抛出NullPointerException 用valueOf代替toString javaBigDecimal bd = getPri

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

解析Java中所有错误和异常的父类java.lang.Throwable

在java语言中,错误类的基类是java.lang.Error,异常类的基类是java.lang.Exception. 1)相同点:java.lang.Error和java.lang.Exception都是java.lang.Throwable的子类,因此java.lang.Error和java.lang.Exception自身及其子类都可以作为throw的使用对象,如:throw new MyError();和throw new MyException();其中,MyError类是java.l

Java Document生成和解析XML操作

一)Document介绍 API来源:在JDK中javax.xml.*包下 使用场景: 1.需要知道XML文档所有结构 2.需要把文档一些元素排序 3.文档中的信息被多次使用的情况 优势:由于Document是java中自带的解析器,兼容性强 缺点:由于Document是一次性加载文档信息,如果文档太大,加载耗时长,不太适用 二)Document生成XML 实现步骤: 第一步:初始化一个XML解析工厂 DocumentBuilderFactory factory = DocumentBuilde

Java如何基于DOM解析xml文件

一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的:jaxp只是api,它进一步封装了sax.dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器).如果是嵌入式的

java中使用sax解析xml的解决方法

在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析 Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档 Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档 本文主要讲解Sax解析,其余放在后面 Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或

在java中使用dom解析xml的示例分析

dom是个功能强大的解析工具,适用于小文档 为什么这么说呢?因为它会把整篇xml文档装载进内存中,形成一颗文档对象树 总之听起来怪吓人的,不过使用它来读取点小东西相对Sax而言还是挺方便的 至于它的增删操作等,我是不打算写了,在我看教程的时候我就差点被那代码给丑到吐了 也正因为如此,才有后来那些jdom和dom4j等工具的存在-- 不多说,直接上代码 Dom解析示例 复制代码 代码如下: import java.io.File; import javax.xml.parsers.Document

java解析xml之dom解析xml示例分享

复制代码 代码如下: package com.test; import java.io.File;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import o

java解析xml之sax解析xml示例分享

复制代码 代码如下: package com.test; import java.io.File;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List; import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;import org.x

Java使用DSA密钥对生成XML签名的方法

本文实例讲述了Java使用DSA密钥对生成XML签名的方法.分享给大家供大家参考.具体实现方法如下: MainClass.java代码如下: 复制代码 代码如下: import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.util.Collections; import javax.xml.crypto.dsig.Canon

Zend 输出产生XML解析错误

XML解析错误:xml处理指令不在实体的开始部分 位置:http://.../public/xml/get 行:2,列:1:<?xml version="1.0"?> ^ 仔细检查后发现是首行为空.找了很久没有找到到底 zend 的 view 在哪儿输出了空行,包括初始化一个新的 View ,但是始终没有找到原因,但是网站主页的首行是没有空的. 网上也有类似的例子,但是他们解决的方法是注意控制输出,但是我不知道 View 怎么控制输出. 弄了半天也没成功,我都快崩溃了,我决