Netbeans打破了在其类之外定义的匿名内部类:语法无效?

时间:2013-07-24 19:11:11

标签: java netbeans

修改

又一次更新。由于它通过javac在命令行上工作正常,但在netbeans中没有,我尝试了a_horse_with_no_name的建议。在Netbeans中关闭“编译保存”也可以解决问题并使程序再次运行。因此,匿名内部类问题只是Netbeans中的一个问题,并且只有在打开“编译保存”时才会出现。

因此,问题是与保存时编译相关的Netbeans错误。

此外,由于有些人似乎存在如此重大的问题,如果复制/粘贴将无法编译代码,我更加简化了示例。删除使得样本不再代表我的用例正在做的基本概念,但对于手头的问题没有必要。

...现在是另一个有趣的小更新。显然Netbeans错误报告有时甚至在编译保存关闭时仍然存在,但是当它发生时,至少在我告诉它运行时它不会影响执行。因此,错误报告分析必须与编译保存功能相关联的后端工具绑定。所以这个bug可能特别适用于任何后端工具。

结束编辑

在另一个类的代码中创建一个匿名的内部类后,Netbeans对此感到害怕。只要它在那里,Netbeans错误报告和程序执行不能正常工作,但如果我删除代码Netbeans再次正常工作。

以下是无效的Java语法吗?

public class A
{
    public class InnerA
    {
    }
}

public class B
{
    public void transform(A a)
    {
        a.new InnerA()
            {
            };
    }
}

在我的特定情况下,我有一个正在运行的模拟,A跟踪其所有内部类实例,并让它们在一段时间内自行执行转换。因此,每个内部类将存在若干秒,做它的事情,然后它的所有者将处置它。

其他类负责通过添加指定操作的内部类的匿名版本来处理A

如果我从A中移除InnerA,使它成为自己的类,它就有效,但对于我的情况,让它成为A的内部类更有意义。

实际上,我的内部类也有其他属性和方法,但这只是一个简单的例子。只要它在那里,a.addInner(a.new InnerA(){})似乎打破了Netbeans。我应该提交Netbeans错误,还是这种非法语法用法?

...编辑 由于有些人非常好奇Netbeans对我来说是多么的好,这里有:有时程序不会通过Netbeans run命令执行,而是说代码中仍然存在错误。代码类似于该示例的代码文件将文件标记为有错误,但代码编辑器部分未在代码中显示任何错误。如果我在代码中进行更改(就像添加空格一样简单)并重新保存,有时打开文件选项卡中的文件列表会从文件中删除错误符号,有时不会删除,有时文件资源管理器面板中的文件列表会删除错误符号,有时不会(有时它们以这种方式彼此不同步),如果两者都没有显示错误,那么有时它会运行,但是当它确实尝试运行Netbeans时说它找不到类,导致我相信它没有编译它,即使它没有将文件标记为错误。

1 个答案:

答案 0 :(得分:1)

不,这是无效的,因为A没有定义addInnerA方法(正如您所示)。你的意思是在这里加一个,我们应该给你带来疑问吗?

此外,您在);的第11行末尾错过B。我们是否也应该对您提出疑问?

如果是这样,那么您确实在addInnerA课程中定义了A,并且您打算在{);中调用addInnerA的结尾B.transform 1}},那么你所拥有的是有效的语法,这将是一个真正的错误。

但是,让我们在这里清楚你在帖子中向我们展示的内容是无效的语法。它仅在您定义A.addInnerA(InnerA)并修复A.addInnerA中对B.transform的调用时才有效。

事实上,用

public class A {
     public class InnerA {
          public void action() { }
     }

     public void addInnerA(InnerA innerA) { }
}

public class B {
     public void transform(A a) {
          a.addInnerA(a.new InnerA() {
              public void action() { }
          });
     }
}

我可以成功地使用Oracle javac进行编译。