2016-04-30 4 views
0

Я пишу короткий алгоритм в Java, используя Netbeans.Заявление о возврате и разрыв не работает в «While Loop»

Проблема, с которой я столкнулась, заключается в том, что код игнорирует оператор return в цикле while. Я также попробовал заявление о разрыве, и он также игнорирует это.

Однако странная часть всего этого заключается в том, что когда я запускаю программу с точками останова, она останавливается, когда она должна (когда она видит определенное значение). Если я запустил его без контрольных точек, он пройдет мимо этой точки.

Вот немного кода:

while (!openList.isEmpty()) { 
     // 1. Remove the best node from OPEN, call it current 
     int bestValue = Integer.MAX_VALUE; 
      for (BestFirstNode inOpen : openList) { 
       if ((inOpen.x == current.x) && (inOpen.y == current.y)) { 
        //skip this node 
       } 
       // 2.If one of the values in openList is the goal state, return the goal value 
       if (inOpen.value < bestValue) { 
        if (inOpen.value == goal) { 
         System.out.println("GOAL!"); 
         openList.clear(); 
         return goal; 
        } 
        //else sent thevalue if the new current nodes 
        bestValue = inOpen.value; 
        current = inOpen; 

        //set the new x and y values that will be used to check 
        //for successors 
        x = inOpen.x; 
        y = inOpen.y; 
       } 
      } 

     //print the current node and its coordinates 
     System.out.println("Current: " + current.value); 
     System.out.println("x: " + current.x + " y: " + current.y + "\n-------------"); 

     //remove current from the openList so it can't be used again 
     openList.remove(current); 

     //3. Create current's successors. 
     Set<BestFirstNode> successors = new HashSet(); 
     int min = 0; 
     int max = 2; 

     //get the top successor 
     if ((x <= max) && (x >= min) && (y - 1 <= max) && (y - 1 >= min)) { 
      successors.add(grid[x][y - 1]); 
     } 

     //get the bottom successor 
     if (x <= max && x >= min && y + 1 <= max && y + 1 >= min) { 
      successors.add(grid[x][y + 1]); 
     } 

     //get the left successor 
     if (x - 1 <= max && x - 1 >= min && y <= max && y >= min) { 
      successors.add(grid[x - 1][y]); 
     } 

     //get the right successor 
     if (x + 1 <= max && x + 1 >= min && y <= max && y >= min) { 
      successors.add(grid[x + 1][y]); 
     } 

     //remove the parent node from the successors list 
     Set<BestFirstNode> successorsFinal = new HashSet<>(); 
     for (BestFirstNode successor : successors) { 
      if (successor != current.parent) { 
       successorsFinal.add(successor); 
      } 
     } 

     //4. Evaluate each successor, add it to OPEN, and record its parent. 
     for (BestFirstNode successor : successorsFinal) { 
      openList.add(successor); 
      successor.parent = current; 
     } 
    } 

Я прочитал несколько других должностей относительно подобных вопросов. Чтение одного сообщения (here) привело меня к попытке запустить отладчик без контрольных точек. Без них я получаю ту же проблему, но я не совсем понимаю ответ. Я также попробовал очистить список, поэтому условие while будет недействительным, но оно все равно продолжается.

Итак, я полагаю, что мой вопрос двоякий:
Как код может полностью игнорировать разрыв или оператор возврата? И как вы можете получить один результат с помощью контрольных точек, а другой без них?

Edit: я добавил полный цикл, а для ясности

+0

Наблюдайте за переменными при отладке, вы найдете результат. – Rugal

+0

@Rugal Я не уверен, что понимаю, как это поможет. Когда я отлаживаю, я получаю ожидаемый результат. – JustBlossom

+0

Откуда появился ваш объект 'inOpen'? Если вы в основном повторяете свой 'openList', вам может быть лучше подходит для этой цели с помощью цикла for-each-loop. Если нет, посмотрите во время отладки свою переменную 'inOpen.value'. Ваш код даже передает второй запрос if? –

ответ

0

ли openList записываются/изменено другим потоком? Возможно, это не безопасный список потоков, который изменяется другим потоком, чем тот, в котором работает ваш цикл while? Или какая нить добавляет цели в список?

0

Это нецелесообразно для запуска вашего кода после оператора возврата. После заявления возврата интерпретатор выходит из метода, и я могу доказать это вам.

Выполните следующий тест, добавьте System.out.printl до и после оператора возврата независимо от того, запускаете ли вы свой код с помощью или без контрольных точек, вы получите тот же результат в отношении оператора return. EDIT:Я не уверен, что этот тест возможен. Я не могу вспомнить, является ли недостижимый код отметкой в ​​качестве предупреждения или ошибки.

То же самое относится к разрыву Выражения, после утверждения break цикл завершен. Но поскольку вы используете несколько циклов внутри друг друга, было бы сложно определить, какой цикл вы выходите.

Программа может изменить ее поведение в режиме отладки, если у вас есть часы. Если метод, на который у вас есть часы, изменяет что-то, чем у вас будет другое поведение.

Пример:

int getX(){ 
    y++; 
    return x; 
} 

Если бы вы были поставить часы на GetX() после каждого останова отладчик будет вызывать GetX() и у будет увеличиваться на 1. И ваша программа будет иметь другое поведение режим запуска.

Вывод:

  1. программка никогда не будет игнорировать возврат или заявление перерыв, пожалуйста, доказать, что я неправ.
  2. Точки останова обновляют ваши часы, часы называют методы, которые они просматривают. Если эти методы изменят значения, то вы будете иметь другое поведение.
Смежные вопросы