以下代码来自Bates和Sierra:
public class Book {
private String title; // instance reference variable
public String getTitle() {
return title;
}
public static void main(String [] args) {
Book b = new Book();
String s = b.getTitle(); // Compiles and runs
String t = s.toLowerCase(); // Runtime Exception!
}
}
String t = s.toLowerCase()
为什么String s = b.getTitle()
导致运行时异常?
答案 0 :(得分:3)
这很容易:对Book的b引用不为null,但您从未为title赋值。它是空的。
答案 1 :(得分:2)
因为标题永远不会被赋予任何价值。非原始实例字段(如title
)默认值为null
。因此,当您说b.getTitle()
时,会返回null
。然后s
为null
,当您尝试取消引用null
时,意味着在其上使用.
运算符,则会出现NullPointerException。尝试:
Book b = new Book(); // b is now a Book object with a null title
b.title = "Programming Java"; // b's title is now a String instead of null
String s = b.getTitle(); // s is now the title that we added to the book
String t = s.toLowerCase(); // t is now the same title in lower case
答案 2 :(得分:2)
空引用可以根据需要多次传递,当您想要实际对引用执行某些操作时,NPE将仅 。要避免NPE,请执行类似
的操作private String title = ""; // instance reference variable
这样,创建工作簿对象时,title
var将不会是null
答案 3 :(得分:1)
new Book()
将创建一个带有空标题private String title;
的图书实例。
当你尝试String t = s.toLowerCase();
时,s为null,因此结果为
答案 4 :(得分:0)
对象获取null
为default value
,字符串为object
因此如果未初始化则为空强>
为什么String t = s.toLowerCase()会导致运行时异常 String s = b.getTitle()不?
嗯,b
已初始化,因此在调用其方法时不会抛出NPE ,但b.getTitle()
会返回null
,因为title
isn初始化,因此当您在s上调用NPE
(为空)时,您将获得toLowerCase()
。
String s = b.getTitle(); ---> s=null;
String t= s.toLowerCase(); ---> t= null.toLowerCase();
Throws NPE;
答案 5 :(得分:0)
b
是有效的初始化Book
对象。但是没有定义标题。因此b.getTitle()
会返回null
。使用s.toLowerCase()
,您尝试在null
上执行一个导致NullPointerException的方法。
您可以通过为title赋予默认值来避免这种情况:
private String title = "default title..";