Java语言学习--Java引用以及NullPointerException问题的解决
来源:互联网 发布:淘宝网拉丁舞服装 编辑:程序博客网 时间:2024/06/01 10:31
一、前言
前段时间在部署JPA项目时被一个java.lang.NullPointerException卡住了好久,后来搞明白了,是一个很基本的java引用的问题,也是一个涉及到Java语言本质的问题,整理了相关资料,记一博客分享之。
二、变量的本质
2.1 概念
计算机语言中能储存计算结果或能表示值的抽象概念,它分为变量名和变量值两部分。
2.2 变量与变量名
变量分为变量名和变量两个部分。在创建一个变量时,会在计算机中开辟一块内存,变量名就是人为地为这块内存起的一个名字,我们可以通过变量名来识别变量,便于我们区别和调用等等。这就相当于一间房子,这间房子又门牌号和房间两部分组成,门牌号是这间房子的标识,住户可以通过门牌号找到你对应的房间并入住。
(而在C和Java等语言的基本数据类型中,基本数据类型的变量不是引用,变量的名字就是存储的内容。)
2.3 变量创建的全程及其本质
如下图:
三、指针变量
指针变量是C语言中所特有的一种数据类型。也就是说,指针变量不同于普通变量,一般变量存储的是变量本身,而指针变量存储的是存放数据的内存单元的地址。可以通过内存单元的地址来访问内存单元,从而获取该内存单元的数据信息。
问题:那么指针变量存在的意义是什么呢?普通变量是如何被访问的?
四、Java中的引用
4.1 Java引用代码解析
如下代码:
Person person = new Person();Person personA = new Person();Person personB = new Person();
在这里,严谨地说,person、personA、personB仅仅是对象的名字而已,并不是对象本身,而是指向Person这个对象类型的一个对象名。
通过下面的验证即可证明之:
package cn.edu.sdut.softlab.test;import cn.edu.sdut.softlab.person.Person;public class PersonTest { public static void main(String args[]) { Person person = new Person(); Person personA = new Person(); Person personB = new Person(); //打印测试各个对象的值 System.out.println("三个对象的值:"); System.out.println("person的值:" + personC); System.out.println("personA的值:" + personC); System.out.println("personB的值:" + personC); // 打印测试String常量 System.out.println("三个对象的String常量:(意味着已经开辟内存空间)"); System.out.println("person的String常量:" + person.toString()); System.out.println("personA的String常量:" + personA.toString()); System.out.println("personB的String常量:" + personB.toString()); // 打印测试Class类型 System.out.println("三个对象的类型:"); System.out.println("person的Class:" + person.getClass()); System.out.println("personA的Class:" + personA.getClass()); System.out.println("personB的Class:" + personB.getClass()); }}
测试结果:
三个对象的值:person的值:nullpersonA的值:nullpersonB的值:null三个对象的String常量:(意味着已经开辟内存空间)person的String常量:cn.edu.sdut.softlab.person.Person@15db9742personA的String常量:cn.edu.sdut.softlab.person.Person@6d06d69cpersonB的String常量:cn.edu.sdut.softlab.person.Person@7852e922三个对象的类型:person的Class:class cn.edu.sdut.softlab.person.PersonpersonA的Class:class cn.edu.sdut.softlab.person.PersonpersonB的Class:class cn.edu.sdut.softlab.person.Person
显然,上面三个变量person、personA、personB都已经实例化,但没有初始化,所以值为null,但是指向的都是同一个变量类型,并且已经开辟了属于自己扥内存空间,只是它们所占据的内存空间的位置不同而已。
4.2 从”NPE”的角度解释Java引用
如下代码所示:
package cn.edu.sdut.softlab.test;import cn.edu.sdut.softlab.person.Person;public class PersonTest { public static void main(String args[]) { Person personC; System.out.println("personC的值:" + personC); System.out.println("personC的String常量:" + personC.toString()); System.out.println("personC的Class类型:" + personC.getClass()); }}
测试结果如下:
Exception in thread "main" java.lang.NullPointerException
原因分析:
这里只是声明了一个Person类型的引用,并没有实例化(初始化),所以,该personC对象没有指向任何实质的Person类型的对象。所以在访问该对象时无法找到其所指向的Person类型的对象,报出NullPointerException错误。
从这个角度也可以看出Java引用以及对象与对象名的本质区别。
4.3 基本数据类型的测试
如下代码所示:
package cn.edu.sdut.softlab.test;import cn.edu.sdut.softlab.person.Person;public class PersonTest { public static void main(String args[]) { String username = null; System.out.println("username的值:" + username); System.out.println("username的String常量:" + username.toString()); System.out.println("username的Class类型:" + username.getClass()); }}
测试结果:
Exception in thread "main" java.lang.NullPointerException
- Java语言学习--Java引用以及NullPointerException问题的解决
- java.lang.NullPointerException的问题与解决
- tomcat6启动出现NullPointerException ReplicationValve.java:348问题的解决
- 解决java.lang.NullPointerException
- 菜鸟学java:NullPointerException异常的解决。
- java.lang.NullPointerException问题
- java.lang.nullpointerexception 问题
- java.lang.NullPointerException空的指针问题
- java.lang.NullPointerException的各种问题
- tomcat 的 java.lang.NullPointerException问题
- 解决 RMContainerAllocator: Exception while unregistering java.lang.NullPointerException问题
- hibernate java.lang.NullPointerException解决
- java 8 Optional 解决NullPointerException
- 解决安装Aptana插件后启动MyEclipse6.5后报错java.lang.NullPointerException的问题
- 解决Context.getExternalFilesDir(null)返回null造成java.lang.NullPointerException的问题
- web连接数据库时,报空指针java.lang.NullPointerException问题--可能的解决方式
- 避免Java的NullPointerException
- 解决java的Long.getLong(str)的NullPointerException错误
- XML,Properties
- SQL 优化经验总结34条
- 自定义线程池-有界队列
- SpringMVC @ResponseBody 415错误处理
- 配色方案生成网站
- Java语言学习--Java引用以及NullPointerException问题的解决
- 手淘、微博、苹果、Twitter、Facebook一大波互联网巨头使用框架被泄露_Netty是什么神秘所在?
- IMX6之SPI接口驱动测试
- SDIO驱动(9)Host注册
- 自定义缓存
- greenDao3.x 详解-简单、明了
- 深入理解Java:内省(Introspector)
- 程序员遇到技术问题该怎么解决
- android EditText控件可输入正负数及小数位