为什么这个引用为null?

时间:2012-12-22 19:09:21

标签: java

以下代码来自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()导致运行时异常?

6 个答案:

答案 0 :(得分:3)

这很容易:对Book的b引用不为null,但您从未为title赋值。它是空的。

答案 1 :(得分:2)

因为标题永远不会被赋予任何价值。非原始实例字段(如title)默认值为null。因此,当您说b.getTitle()时,会返回null。然后snull,当您尝试取消引用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)

java中的

对象获取nulldefault 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..";