私は3つの別々のファイルに3つのクラスを持つこの基本的なプログラムを書いています。 2つのDieオブジェクトで構成されたPairOfDiceというクラスからなるプログラムであると考えられます。個々のダイ値を設定し取得するメソッド、ダイスをロールするメソッド、および2つのダイ値の現在の合計を返すメソッドが含まれています。 RollingDiceというドライバクラスは、PairOfDiceオブジェクトをインスタンス化して使用します。ローリングダイスプログラムの "スレッド内の例外"メイン "java.lang.NullPointerException"エラー
それは問題なくコンパイルが、私は実行しようとすると、次のように実行時エラーが発生: PairOfDice.rollDice(PairOfDiceのスレッド「メイン」のjava.lang.NullPointerExceptionで
例外を。 Javaの:42) RollingDice.main(RollingDice2.java:16で)
public class RollingDice
{
public static void main(String[] args)
{
PairOfDice pairofdice=new PairOfDice();
pairofdice.rollDice();
System.out.println(pairofdice.getDie1() +"\t" +pairofdice.getDie2());
}
}
public class PairOfDice
{
private Die die1, die2;
public PairOfDice()
{
Die die1=new Die();
Die die2=new Die();
}
public int getDie1()
{
return die1.getFaceValue();
}
public int getDie2()
{
return die2.getFaceValue();
}
public void setDie1(int dieValue)
{
die1.setFaceValue(dieValue);
}
public void setDie2(int dieValue)
{
die2.setFaceValue(dieValue);
}
public void rollDice()
{
die1.roll();
die2.roll();
}
public int sum()
{
return die1.getFaceValue()+die2.getFaceValue();
}
}
public class Die
{
private final int MAX = 6;
private int faceValue;
public Die()
{
faceValue = 1;
}
public void roll()
{
faceValue = (int)(Math.random() * MAX) + 1;
}
public void setFaceValue(int value)
{
faceValue = value;
}
public int getFaceValue()
{
return faceValue;
}
public String toString()
{
String result = Integer.toString(faceValue);
return result;
}
}
NullPointerExceptionをデバッグするためのヒューリスティックはほぼ同じです。例外のスタックトレースを読み取り、例外が発生したコード行、例外をスローする行、およびその行を慎重に検査して、どの変数がnull、ここでは 'PairOfDice.java:42'とし、その理由を調べるためにあなたのコードをトレースします。あなたは何度も何度も走り、私を信頼してくれるでしょう。今後は、NPEのさらに別の質問を投稿するにはあまりにも一般的な問題であるため、投稿する前に件名を検索してください。 –
'PairOfDice'のコンストラクタをよく見てください。 –
あなたはdie1とdie2変数をシャドーイングしています。それをしないでください。それらをコンストラクタで再宣言しないでください。 –