Как я могу отладить это NullPointerException?

Решение

Когда ваш фоновый процесс сталкивается с ситуацией, когда требуется, чтобы пользователь запрашивал ввод, используйте FutureTask , выполненный в Platform.runLater - showAndWait диалоговое приглашение в потоке приложения JavaFX. В фоновом режиме используйте futureTask.get , чтобы приостановить фоновый процесс, пока пользователь не введет необходимые значения, которые позволят продолжить процесс.


Образец Code snippet

Вот сущность кода для этого подхода, который может быть помещен внутри метода вызова вашего фонового процесса:

String nextText = readLineFromSource();
if ("MISSING".equals(nextText)) {
  updateMessage("Prompting for missing text");
  FutureTask futureTask = new FutureTask(
    new MissingTextPrompt()
  );
  Platform.runLater(futureTask);
  nextText = futureTask.get();
}
...
class MissingTextPrompt implements Callable {
  private TextField textField;

  @Override public String call() throws Exception {
    final Stage dialog = new Stage();
    dialog.setScene(createDialogScene());
    dialog.showAndWait();
    return textField.getText();
  }
  ...
}

Пример приложения

Я создал небольшое, полное примерное приложение , чтобы продемонстрировать этот подход.

Выходной пример приложения-примера:

promptingtaskdemooutput [/g9]

Пример вывода Объяснение

Линии, считанные без пропущенных значений, являются просто коричневыми. Строки с введенным быстрым значением имеют бледно-зеленый фон. Четырнадцать строк были прочитаны, фоновая задача уже приостановлена ​​на 6-й строке, где отсутствует значение. Пользователю было предложено указать отсутствующее значение (к которому пользователь ввел xyzzy), затем процесс продолжался до строки 14, которая также отсутствует, и фоновая задача снова приостановлена, и отображается диалоговое окно приглашения.

13
задан Isaac Waller 1 August 2009 в 23:13
поделиться

6 ответов

По вашему мнению, NPE вызвано вами, а не Android. NPE может появиться в строке ActivityThread.performLaunchActivity (ActivityThread $ ActivityRecord): 2268 , но это означает, что вы передали нулевой указатель на что-то, и он продолжал передаваться до тех пор, пока performLaunchActivity не попробовал использовать он разбился, когда обнаружил нулевой указатель.

Если мы сможем увидеть полный LogCat, особенно все, выделенное красным цветом в Eclipse LogCat, это поможет при отладке. Я вывернул себя наизнанку в поисках NPE только для того, чтобы кто-то другой нашел неуместную очень тонкую строку инициализации ресурса.

3
ответ дан 1 December 2019 в 17:20
поделиться

кнопка с надписью «Изменить путь поиска источника»

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

2
ответ дан 1 December 2019 в 17:20
поделиться

Я не работал с Andriod, но Eclipse сможет показать вам стек вызовов. Посмотрите на точку, где программа выходит из вашего кода и входит в чужой, и убедитесь, что все ваши переменные верны (не равны нулю, содержат «правильные» данные и т. Д.).

1
ответ дан 1 December 2019 в 17:20
поделиться

Даже если это происходит в коде Android, вы все равно сможете сузить область, в которой это происходит, и какие из ваших переменных ему не нравятся. Да, расплывчатый ответ, больше нечего сказать. Или загрузите исходный код и сообщите Eclipse, где он находится.

0
ответ дан 1 December 2019 в 17:20
поделиться

Не могли бы вы показать полный стек вызовов?

Обычно, по крайней мере, с Android, исключение запускает две отдельные трассировки. Первый бесполезен. Второй вариант, помеченный как «Вызвано исключением», - это тот, который вам нужен.

И даже если ни одна трассировка стека не содержит вашего кода, мы можем распознать что-то, увидев все это целиком.

2
ответ дан 1 December 2019 в 17:20
поделиться

Мне самому это было интересно, и даже несмотря на то, что он показывал «вызвано» в logcat, я хотел, чтобы отладчик действительно сломал то место, где был брошен NullPointer (даже если он был пойман)

Вот как:

  1. Выполнить -> Добавить точку останова исключения Java
  2. Найдите исключение NullPointerException (или что-то еще, что вы можете отладить (исключение «Причинено»)
  3. Убедитесь, что установлен флажок «Приостановить при обнаружении исключений». Нажмите «ОК».
  4. Вы должны увидеть новая точка останова в вашем представлении

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

54
ответ дан 1 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: