StockoverflowRestful API
吾生也有涯,而知也无涯
版本号 | 修改人 | 修改日期 | 修改内容 |
---|---|---|---|
v1.0 | shanYueFenCheng | 2019-05-06 | Restful文档 |
说明
翻译Stackoverflow的问题与答案,参考谷歌翻译,结合中文,保留原意的基础上有精简,水平有限仅用于分享和学习,有什么错误,请多多指教
为什么有指针异常 如何解决
什么是空指针异常,原因为何? 哪些方法和工具可以确定原因,解决空指针异常?
What is a NullPointerException, and how do I fix it?
原地址
获得认同最多回答
基本数据类型
- 当你声明一个引用变量时,实际上你是创建一个指针,用以指向一个object(这个object可以是值或者对象),研究下面代码,你声明一个int基本类型的变量:
int x;
x = 10;
- 例子中,x是一个int变量,Java会为你初始化为0,即int=0。 在第二行中,将值10赋给x,实际上是将10写入到x变量指向的内存位置上。但是,当你声明引用类型变量时,情况会不同。 研究下面代码:
引用数据类型
Integer num;
num = new Integer(10);
-
第一行声明一个num的变量,他是一个引用变量,Java不会赋初始化值,它只包含一个指针(因为Integer类型是一个引用类型)。 既然你没有说这个变量指向什么,Java会将变量设置为null,意思是“我指向什么都没有”。
-
在第二行中,new关键字用来实例化(创建)一个Integer类型的对象,对象创建在堆上,会分配一个内存地址,此时引用变量num被分配了这个地址。 现在你可以使用解除引用操作符,一个点 “.”,用变量x来引用这个Interger对象。
-
空指针null发生在声明变量但未创建对象时,如果用num.来引用对象时,就会发生NullPointerException,通常在情况下,编译器会捕获这个问题,告诉你num可能没被初始化,但是,调用方法时,代码中使用的对象不是被创建出来的,而是被传递过来的。
引用变量在方法间传递
- 例如,你有如下方法:
public void doSomething(SomeObject obj) {
//使用obj对象
}
- 在这种情况下,你不是创建对象obj,而是调用doSomething方法之前被创建的,传递引用获取到。 不幸的是,可以像这样调用方法:
doSomething(null);
-
obj为null。 对obj进行引用操作,就是
null.
,对什么都没有进行解引用来获取对象,获取不到当然要抛出空指针异常NullPointerException,因为它是程序员错误,异常信息可以用于调试。 -
还有一种情况,该方法可以接受obj对象进行操作,也可以接受null进行其他操作。你可能需要检查参数obj是不是null,处理不同的逻辑。 研究下面代码:
/**
* @param obj 使用obj对象做点什么,如果传入的是null,就做点什么
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
// obj不为空,做...
} else {
// obj是null,做...
}
}
最后参考 《如何定位异常和使用异常堆栈查看原因》
How to pinpoint the exception & cause using Stack Trace