0

次のコードでLinkedListは、は-明らかに-リンクリストを作成するためのクラスであり、メソッドinsertFirst(..)と。がありdisplayList()ます。

このクラスを使用して、別のクラス->FCFSクラスに変数を作成しようとしました。process.insertFirst(..)クラスFCFSでプライベート変数として宣言すると、次の行でNullPointerExceptionエラーが発生しますprocess.display()。メソッド内で宣言したときwork()は完全に機能しました。

これが機能する理由を理解したいだけです。

public class FCFS {   
    public void work(){
      LinkedList process = new LinkedList();  
      process.insertFirst(3);
      process.displayList(); 
    }     
}

これはしませんが:

public class FCFS {
    private LinkedList process;

    public void work(){
        process.insertFirst(3); 
        process.displayList(); 
    }     
}
4

5 に答える 5

3

process2番目のコードサンプルでは、​​最初のコードサンプルのように初期化されていません。したがって、Javaは、 JLS 4.12.5nullに従って、自動的にに初期化します。使用する:

private LinkedList process = new LinkedList();

または、コンストラクターを使用できます。

public FCFS() {
    process = new LinkedList();
}
于 2013-03-26T17:44:27.377 に答える
3

2番目のバージョンでは、初期化することはないprocessため、デフォルト値はnullになります。逆参照すると、が得られますNullPointerException

ローカル変数バージョンで初期化processするnullと、まったく同じ問題が発生します...processインスタンスフィールドバージョンでnull以外の値に初期化すると、機能します。ただし、どこで初期化する必要があるかはすぐにはわかりません。これは、クラスの他の部分の設計によって異なります。

ローカル変数をまったく初期化しないと、コンパイル時エラーが発生します。フィールドにはデフォルト値(0、null、falseなど)がありますが、ローカル変数には初期化されません。コンパイラーは、初期化しないことを保証します。明確に割り当てられていない変数から読み取ります。

変数がメソッドの期間中のみ有効である必要がある場合(論理的にクラスの状態の一部ではない場合)、とにかくローカル変数である方がよいことに注意してください。

LinkedListまた、Javaにはすでに(汎用)タイプが付属していることに注意してください。このコードが学術目的のみであることを願っています:)

于 2013-03-26T17:44:40.920 に答える
3

メソッドで宣言するときは、null以外の値も割り当てます。

LinkedList process = new LinkedList(); 

クラス内で、Javaコンパイラはプロセス変数をnull値、つまりNPEで初期化します。解決するには、プライベート変数を次のように宣言する必要があります。

private LinkedList process = new LinkedList(); 
于 2013-03-26T17:45:54.280 に答える
1

あなたが直面しているエラーの種類は、nullポインタ例外ですか?リンクリストを最初に初期化してみてください

private LinkedList process = new LinkedList();
于 2013-03-26T17:46:35.673 に答える
1

2番目の例では、LinkedListを初期化しませんでした(最初の例では初期化しました)。これを行う必要があります:

public class FCFS {
  private LinkedList process = new LinkedList();

public void work(){

  process.insertFirst(3);

  process.displayList(); 
}

}

またはこれ(私は通常これを好む):

public class FCFS {
  private LinkedList process;

public FCFS(){
  this.process = new LinkedList();
}

....(work method)

}

そして、FCFSを実行するコードで、work()はFCFSを初期化します。

FCFS myFCFS = new FCFS();
myFCFS.work();
于 2013-03-26T17:48:55.073 に答える