-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参照はnullではありませんが、titleに値を割り当てたことはありません。nullです。

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

ヌル参照は必要な回数だけ渡すことができます。NPEは、参照を使用して実際に何かを実行したい場合にのみ発生します。NPEを回避するには、次のようにします。

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

そうtitleすれnullば、ブックオブジェクトが作成されたときに変数が作成されなくなります

于 2012-12-22T19:11:47.393 に答える
1

new Book()nullタイトルの本インスタンスを作成しますprivate String title;

sを試してみるString t = s.toLowerCase();とnullであるため、結果は

于 2012-12-22T19:11:32.013 に答える
0

javaのオブジェクトnullはasとして取得されdefault valueStringobjectしたがって、初期化されていない場合はnullになります。

String s = b.getTitle()が発生しないのに、String t = s.toLowerCase()がランタイム例外を発生させるのはなぜですか?

まあ、b初期化されているので、そのメソッドを呼び出したときにNPEをスローb.getTitle()しませんが、初期化されていないので返さnullれます。したがって、s(null)で呼び出すtitleと取得します。NPEtoLowerCase()

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。NullPointerExceptionを引き起こすs.toLowerCase()メソッドを実行しようとしています。null

タイトルにデフォルト値を指定することで、これを回避できます。

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