2012-12-22 40 views
-2

下面的代碼是從貝茨和塞拉利昂:爲什麼這個引用是null?

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

後錯誤日誌:

您可以通過給標題的默認值,避免這一點。 –

+0

哇,5分鐘內回覆。 – micha

回答

2

空引用,可以根據需要多次傳遞,將出現NPE 只有當你想真正做到與參考的東西。爲了避免NPE,這樣做

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

這樣,你的title VAR不會null創建

+0

「只有當你想用參考文獻實際做某件事時」現在我明白了!它可以是空的並被引用,除非你想對它做些什麼,在這種情況下會產生一個錯誤。非常感謝! – user1828538

+0

沒問題!此外,你在這裏有很多答案,你應該接受一個答案。 –

+0

如何接受? – user1828538

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 
1

new Book()將與空標題private String title;一本書實例。

當您嘗試 String t = s.toLowerCase();小號

爲空,因此結果

0

對象當Book對象在Java中獲得nulldefault value字符串是因此如果沒有初始化,將會是null

爲什麼String t = s.toLowerCase()會導致運行時異常 String s = b.getTitle()不會?

好,b因此初始化它不會扔NPE時調用它的方法,但是b.getTitle()將返回nulltitle沒有初始化,因此,當你調用S上toLowerCase()(這是空你NPE )。

String s = b.getTitle(); ---> s=null; 
String t= s.toLowerCase(); ---> t= null.toLowerCase(); 
Throws NPE; 
3

很簡單:Book的b引用不爲null,但是您從未爲標題賦值。它是空的。

0

b是一個有效的初始化的Book對象。然而沒有標題被定義。所以b.getTitle()返回null。使用s.toLowerCase()您嘗試執行導致NullPointerException的null上的方法。也

private String title = "default title..";