Netbeans не может найти основной класс при создании анонимного подкласса внутреннего класса анонимного подкласса

Когда я пытаюсь создать новый анонимный подкласс Action внутри инициализации анонимного подкласса содержащего его класса, содержащего класс, Netbeans внезапно не может найти основной класс при запуске, несмотря на то, что может без проблем очищать + строить и работать с этим код закомментирован. script.new Action(0) {...} вызывает ошибку: не удалось найти или загрузить основной класс при запуске Комментирование кода приводит к успешному запуску

Структура кода:

Основной пакет:

  • Main class <-- currently looking at this file
    • public void run(...) (called in main(String[] args))
      • Actor a = new Actor() {
        • Script script = new Script();
        • { (Actor instance initiation code)
          • script.new Action(0) {...} causes breakage
  • Package actor
    • public abstract class Actor
      • public class Script
        • public abstract class Action

Воспроизведено в простом классе:

package tests;

public class ClassTester {
    public static void main(String[] args) {
        ClassTester tester = new ClassTester();
        tester.run();
    }
    public void run() {
        final Inner1 A = new Inner1() {
            {
                B = this.new Inner2() {
                    @Override
                    public void run() {
                        System.out.println("Hello, world!");
                    }
                };
            }
        };
        A.B.run();
    }
    public class Inner1 {
        public Inner2 B;
        public abstract class Inner2 implements Runnable {
        }
    }
}
-->
Error: Could not find or load main class tests.ClassTester
Java Result: 1

Интересно, что -XX:+PrintCompilation показывает, что перед сбоем что-то запускается:

     50    1             java.lang.String::hashCode (55 bytes)
     50    2             java.lang.String::charAt (29 bytes)
Error: Could not find or load main class tests.ClassTester
Java Result: 1

Версия продукта: IDE NetBeans 7.3.1 (сборка 201306052037) Java: 1.7.0_25; Java HotSpot(TM) 64-битный сервер VM 23.25-b01 Среда выполнения: Java(TM) SE Runtime Environment 1.7.0_25-b17 Система: Windows 7 версии 6.1, работающая на amd64; СР1252; en_US (примечание)

Очистка, сборка и перезапуск Netbeans не решили проблему. Это поправимо или ошибка в Netbeans?


person Vitruvie    schedule 19.12.2014    source источник
comment
Было бы очень полезно, если бы вы могли предоставить короткую, но полную программу, демонстрирующую проблему.   -  person Jon Skeet    schedule 19.12.2014
comment
Предположительно с заявлением о пакете, верно?   -  person Jon Skeet    schedule 19.12.2014
comment
Хм. У меня не установлен Netbeans, поэтому я не могу воспроизвести его самостоятельно, но он отлично работает с javac. Ради интереса, можете ли вы найти скомпилированные .class файлы? Можете ли вы запустить его из командной строки без каких-либо проблем?   -  person Jon Skeet    schedule 19.12.2014
comment
@JonSkeet Файлы классов находятся прямо здесь, и jar, созданный Netbeans, отлично работает из командной строки.   -  person Vitruvie    schedule 19.12.2014
comment
Странный. Спасибо за дополнительную информацию - извините, я не мог быть более полезным :(   -  person Jon Skeet    schedule 19.12.2014
comment
Основной класс, указанный в ошибке, относится к отсутствующему классу с public static void main(String[] args). Я не видел упомянутого основного метода.   -  person Joop Eggen    schedule 19.12.2014
comment
@JoopEggen Основной метод не показан на снимках экрана, но он присутствует, как и в классе ClassTester, у которого та же проблема.   -  person Vitruvie    schedule 19.12.2014
comment
В случае ClassTester имя, содержащее Test, по умолчанию классифицирует источник как модульный тест. Рефакторинг - Переименуйте его во что-то другое. В моем файле запуска NetBeans был отключен для ClassTester, а не для ClassJester. На данный момент избегайте теста   -  person Joop Eggen    schedule 19.12.2014
comment
@JoopEggen Обратите внимание, что закомментирование строки B = this.new Inner2(){...} приводит к тому, что программа работает нормально (конечно, до NPE). Рефакторинг его в jests.ClassJester выдает ту же ошибку. Run File не отключен для меня, это может быть связано с тем, что он находится в моем проекте Tests, в котором тесты являются единственным пакетом. Источником проблемы является создание анонимного подкласса Inner2 внутри A.   -  person Vitruvie    schedule 20.12.2014


Ответы (1)


Мне удалось воспроизвести проблему в NetBeans 7.3.1. Проблема связана с ошибкой №224770. Сводка исправлений: #224770: обработка new с включением выражения более похожа на vanilla javac, сохраняя при этом корректные выходные данные API.

У вас есть два варианта.

  1. Обновите NetBeans до версии 7.4 или новее. Я протестировал код в 7.4, и он работал правильно.
  2. Продолжайте использовать NetBeans 7.3 и не используйте "this.new". Измените строку 11 на эту:

    B = новый внутренний2 () {

person Corey    schedule 23.12.2014
comment
Вариант 2 не работает в реальном неупрощенном коде, потому что есть 3 класса, а окружающий класс не является текущим классом; однако вариант 1 сработал. Я даже не знал, что Help-›Check for Updates не сообщит мне об основных изменениях версии. - person Vitruvie; 23.12.2014