Java вводит оператор if, который является ложным - PullRequest
8 голосов
/ 03 ноября 2011

Я сталкиваюсь с самой странной ошибкой в ​​этой программе, которая подтверждается при отладке.У меня есть следующий код (разобрано, чтобы подчеркнуть проблему, конечно):

BHFrame.java

public class BHFrame
{
  private boolean uSS;
  private StateSaver stateSaver;

  public BHFrame(boolean useInternalStateSaver)
  {
    //Init code

    uSS = useInternalStateSaver;

    //More init code
    System.out.println(uSS);
    if (uSS)
    {System.out.println("Entered 1");
      stateSaver = new StateSaver(title, false);
      stateSaver.addSaveable(getThis());
    }

    //More init code
    System.out.println(uSS);
    if (uSS)
    {System.out.println("Entered 2");
      try
      {
        stateSaver.loadState();
        stateSaver.putState(getThis());
      }
      catch (IOException ex)
      {
        alertUserOfException(ex);
      }
    }
  }
}

GUI.java

public class GUI extends BHFrame
{
  public GUI(boolean useInternalStateSaver)
  {
    super(useInternalStateSaver);
  }
}

Main.java

public class Main
{
  public static void main(String[] args)
  {
    GUI gui = new GUI(false);
  }
}

Выходные данные

false
false
Entered 2
Exception in thread "main" java.lang.NullPointerException
    at bht.tools.comps.BHFrame.<init>(BHFrame.java:26)
    at bhms.GUI.<init>(GUI.java:5)
    at bhms.Main.main(Main.java:5)

Класс BHFrame расширен и запущен из дочернего класса, который вызывает этот конструктор, но на самом деле это не должно влиять на это поведение.Проблема в том, что, когда false передается в конструктор как useInternalStateSaver, первый if (uSS) пропускается, а второй вводится.После отладки я обнаружил, что uSS равен false во время выполнения, в том числе в строке второго оператора if здесь. Зачем Java вводит оператор if, когда условие возвращает false? Прежде чем вы спросите, я действительно удалил файлы .class и перекомпилировал его на тот случай, если с ним возник какой-то остаточный код,но я получил тот же результат.И будьте уверены, здесь отображаются все ссылки на переменную uSS.

Решение


Оказывается, это ошибка в NetBeans 7.1 Build 201109252201,при этом среда IDE неправильно вставляет новый код в скомпилированные файлы .class.Проблема была исправлена ​​путем внешней компиляции файлов. отчет об ошибке отправлен.

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Что бы ни выбрасывало это исключение, вероятно, не в размещенном вами коде.

Он не перехватывается вашим оператором catch, который только перехватывает IOException.

Это исключение NullPointerException, которое может возникнуть где угодно.

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

Добавляйте сообщения отладки в разных точках, чтобы точно увидеть, что происходит. Или, вы знаете, посмотрите на строку 26 (wayyyyy перед опубликованным кодом), чтобы понять, почему вы получаете исключение NullPointerException.

0 голосов
/ 03 ноября 2011

Это всего лишь предположение, потому что я не вижу код, который вы упоминаете, но я считаю, что вы определили локальную переменную uSS во втором //More init code сегменте.

Как только вы определитепеременная local , названная так же, как переменная instance , она «скрывает» переменную экземпляра.Лучше квалифицировать все переменные экземпляра с this.

Итак, попробуйте квалифицировать все вышеуказанные обращения к uSS с помощью this. ... (this.uSS)

Evenесли проблема не в этом, может быть лучше в любом случае опубликовать полный код.

HTH

0 голосов
/ 03 ноября 2011

Я видел такие сумасшедшие вещи, когда на машине не хватает оперативной памяти.Возможно, вы захотите запустить memtest86.

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

...