0

すべてのオブジェクトを正しく初期化したにもかかわらず(私の知る限り)、nullポインター例外が発生します。基本的に、私は私がばかだった場所を指摘する誰かが必要です。

ランタイムNPEはここで発生します:

public class CDAlbum implements Album{
    private String title;
    private String genre;
    private String artist;
    private ArrayList<String> tracks;
    private int i=0;

    public CDAlbum() {    //constuctor
        title   = "Unknown CD";
        genre   = "Unknown genre";
        artist = "Unknown artist";
        ArrayList<String> tracks = new ArrayList<String>(); //NPE occurs on this line
        tracks.add("-- no tracks --");
    }
    //snip

そして、コンストラクターを呼び出すコード:

CDAlbum tempCD;
tempCD = new CDAlbum();

私はすべてを適切に初期化していると思うので、このnullポインター例外がどこから来ているのかわかりません。少しの援助?

4

2 に答える 2

2

結局のところ、あなたの問題はあなたがあなたのコードを再コンパイルするのを忘れていたからでした!ドロップボックスからコードをダウンロードした後、逆コンパイルCDAlbumして古いコンストラクターを明らかにしました。

public CDAlbum() {
  i = 0;
  title = "Unknown CD";
  genre = "Unknown genre";
  artist = "Unknown artist";
  tracks.add("-- no tracks --");
}

再コンパイル後(私の提案に従った後)、コードは正常に機能しているように見えました。


コメントで述べたように、ここでのコードはおそらく変更されており、例外を生成する実際のコードではありません。フィールドに追加しようとしている可能性が高いですが、tracksフィールドを初期化したことはありません。ローカル変数を初期化しただけ ですtracks

次のようなことをしてみてください...

tracks = new ArrayList<>(Collections.singleton("-- no tracks --"));

正確なヘルプを受けるには、 SSCCEまたは少なくとも変更されていないコードを投稿する必要があります。ブラックボックスとして扱うと、問題を解決するのは難しいでしょう。


すべての初期化をフィールド宣言に移動できることに注意してください。

private String title = "Unknown CD";
于 2012-08-26T00:17:31.330 に答える
1

この線

ArrayList<String> tracks = new ArrayList<String>();

する必要があります

tracks = new ArrayList<String>();

上記のクラススコープですでに宣言しているので、そうすべきではないときに再宣言しています。

private ArrayList<String> tracks;
于 2012-08-26T00:14:14.667 に答える