2017-02-20 3 views
0

私はパズルプログラムをコーディングしていました。 Javaプログラムをコンパイルすると成功しました。しかし、私がそれを実行すると、それは表示されます幅の最初の検索java.lang.NullPointerException

Solution to problem using breadth first : 
Exception in thread "main" java.lang.NullPointerException 
at SolvingProblem.isGoal(SolvingProblem.java:24) 
at AbstractTreeSearch.solve(AbstractTreeSearch.java:31) 
at EightP.main(EightP.java:15) 

私は数時間を費やしてコードを修正しましたが、失敗しました。理想的には、3x3アレイ構成を示すはずです。誰も私をここで助けて問題の原因を指摘できますか?

State initialState = new State(State.arrayA); 
State GoalState = new State(State.arrayG); 

@Override 
public Object getInitialState() { 
    return initialState; 
} 

@Override 
public boolean isGoal(Object state) { 
    return state.equals(GoalState); 
} 

利用可能なコードから

public Node solve(Problem problem) { 

    //initialize the search tree using the initial state of problem 
    frontier = initFrontier(); 
    frontier.addAll(expand(new Node(problem.getInitialState()), problem)); 
    //Starting frontier 
    boolean done = false; 
    Node solution = null; 
    while (!done) { 
     if (frontier.isEmpty()) { 
      System.out.println("Blank frontier"); 
      done = true; 
     } else { 
      Node node = chooseLeafNode(frontier, problem); 
      //inspecting node 
      if (problem.isGoal(node.getState())) { 
       System.out.println("Solution found"); 
       System.out.println(); 
       solution = node; 
       done = true; 
      } else { 
       //Expanding node, frontier is.. 
       frontier.addAll(expand(node, problem)); 

      } 
     } 
    } 

答えて

0

以下の別のクラスは、それが原因で、このラインである可能性が高いようだ:

problem.isGoal(node.getState()) 

node.getState()のコードはnullを返して、これはあります次にisGoalメソッドに渡され、次にstate.equals(GoalState)を呼び出します。 stateはヌルでオブジェクトではないので、equalsを呼び出すことはできません。したがって、NullPointerException(NPE)を呼び出すことはできません。 (それが許可されていない場合)

どちらの確保getState()はNULLを返さない、またはgetState()はnullにすることができます場合は、/ isGoalメソッドのチェックを持っている。この例処理する必要があります。この例では

@Override 
public boolean isGoal(Object state) { 
    return state != null && state.equals(GoalState); 
} 

をI &&は短絡オペレータであるため、NPEは避けてください。これは、必要な場合を除いて右辺が評価されないことを意味します(NPEを避ける)。詳細については、hereを参照してください。

+0

こんにちは、ありがとうございます。これは役に立つアドバイスです。私はそれをトラブルシューティングし、私のchooseleafnode()が値を返さなかったことを知った。したがって、null。その後、別のクラスで変数の初期化が行われます。これは、2D配列がchoiceleafnode()に値を渡すことができないことと関係がある。私は1D配列に戻って動作します。 – lowerbound

関連する問題