2017-02-20 3 views
0

Я кодировал программу-загадку. Когда я скомпилировал свою программу на Java, она прошла успешно. Но когда я запускаю его, он показываетwidthth first search 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() не возвращает нуль (если это не разрешено), или если getState() может быть пустым, вам нужно иметь isGoal метод проверки/обработки этого, например:

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

В этом примере я избегать NPE, так как && является оператором короткого замыкания, что означает, что правая сторона не оценивается, если это необходимо (избегая NPE). См. here для получения дополнительных пояснений.

+0

Hi xim, спасибо. Это полезный совет. Я устранил проблему и выяснил, что мой selectleafnode() не возвращает никакой ценности. Таким образом, null. Затем это приводит к моей инициализации переменной в другом классе. Это как-то связано с 2D-массивом, неспособным передать значение в selectleafnode(). Я вернулся к 1D массиву, и он работает. – lowerbound