-2

以下代码来自 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()

4

6 回答 6

3

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

于 2012-12-22T19:11:58.330 回答
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
于 2012-12-22T19:11:19.123 回答
2

Null 引用可以根据需要多次传递,NPE只会在您想对引用进行实际操作时发生。为了避免 NPE,请执行以下操作

private String title = ""; // instance reference variable

这样,您的titlevar 将不会null在创建 Book Object 时出现

于 2012-12-22T19:11:47.393 回答
1

new Book()将制作一个带有 null title 的 book 实例private String title;

当您尝试时String t = s.toLowerCase();s 为空,因此结果

于 2012-12-22T19:11:32.013 回答
0

java中的对象null获取as default valueString是一个object因此如果没有初始化它将是null

为什么 String t = s.toLowerCase() 会导致运行时异常,而 String s = b.getTitle() 不会?

好吧,b已初始化,因此在调用其方法时它不会抛出 NPE,但是b.getTitle()会返回未初始化,因此当您在 s 上调用时会得到null(这是 null)。titleNPEtoLowerCase()

String s = b.getTitle(); ---> s=null;
String t= s.toLowerCase(); ---> t= null.toLowerCase();
Throws NPE;
于 2012-12-22T19:11:52.667 回答
0

b是一个有效的初始化Book对象。但是没有定义标题。所以b.getTitle()返回null。随着s.toLowerCase()您尝试执行null导致 NullPointerException 的方法。

您可以通过给 title 一个默认值来避免这种情况:

private String title = "default title..";
于 2012-12-22T19:12:25.560 回答