Я сталкиваюсь с самой странной ошибкой в этой программе, которая подтверждается при отладке.У меня есть следующий код (разобрано, чтобы подчеркнуть проблему, конечно):
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
.Проблема была исправлена путем внешней компиляции файлов. отчет об ошибке отправлен.