Java 无法检索';的正确封闭实例;这';

Java 无法检索';的正确封闭实例;这';,java,eclipse,debugging,jboss,Java,Eclipse,Debugging,Jboss,不幸的是,我无法发布完整的代码,也无法用更小的示例重现它。 我希望这个解释足够了 如果我尝试在断点处从“var”检索值,我总是会收到以下消息: Evaluation failed. Reason(s): Unable to retrieve the correct enclosing instance of 'this' 变量视图的前两个级别如下所示: this MENU$1 (id=291) this$0 MENU (id=292) this$0 M

不幸的是,我无法发布完整的代码,也无法用更小的示例重现它。 我希望这个解释足够了

如果我尝试在断点处从“var”检索值,我总是会收到以下消息:

Evaluation failed. Reason(s):
Unable to retrieve the correct enclosing instance of 'this'
变量视图的前两个级别如下所示:

this    MENU$1  (id=291)    
   this$0   MENU  (id=292)  
   this$0   MENU  (id=292)  
无论出于何种原因,都有两个此$0条目具有相同的id

我可以在variables视图中查看var的值,但无法在display或expressions视图中或直接在代码中执行“var”、“this.var”或任何涉及var的内容

public class MENU{

  private String var;
  ...
  private void menup() {
     this.main("menup",
         new MainProcess() {
             public void run() {
                 System.out.println(var); // breakpoint here
                 ...
             }
         }
     );
  }
  ...
}
MainProcess.run()的调用流有点奇怪,我所能提供的就是这个stacktrace:

 MENU$1.run() line: 173 
 MENU(Application).mainRun(Application$Main) line: 2688 
 MENU(Application).main() line: 2529    
 MENU(MainApplication).runApplication() line: 54    
 ApplicationHandler.dxfr(MainApplication, Record) line: 256 
 ApplicationSession$ApplicationRunner.run() line: 138   
 Thread.run() line: 662 [local variables unavailable]   
编辑:

显示视图中的执行结果:

this This actually seems to successfully return this.toString() this.var cannot be resolved or is not a field var Unable to retrieve the correct enclosing instance of 'this' MENU.this.var Unable to retrieve the correct enclosing instance of 'this' 这实际上似乎成功地返回了这个.toString() this.var无法解析或不是字段 var无法检索“this”的正确封闭实例 MENU.this.var无法检索“this”的正确封闭实例 代码正在JBoss 4应用程序服务器中运行。

通过以下语句:

    ...
    this.main("menup",
        new MainProcess() {
            public void run() {
                System.out.println(var); // breakpoint here
                ...
创建一个匿名类,该类扩展/实现MainProcess(取决于它是类还是接口)。一般来说,匿名类应该能够通过
菜单访问父类的字段。正如其他人建议的那样,这个.var
。由于这似乎不起作用,您可以尝试:

  MENU$1.this.var
如果这样做有效,这意味着您在匿名类中有另一个
var
字段(很可能继承自
MainProcess

总的来说,我强烈建议您使用显式定义的内部类,而不是匿名类-这使事情更加清楚,并有助于避免混淆:

public class MENU{

  private String var;
  ...
  private void menup() {
     this.main("menup", new MyMainProcess() );
  }
  ...
  private class MyMainProcess extends MainProcess {
     public void run() {
         System.out.println(var); // breakpoint here
         ...
     }
 }
}

您是否尝试过
菜单。这个.var
?是的,它也不起作用。它给出的错误与“var”相同。MENU$1.this.var导致“MENUA$1无法解析为类型”MainProcess没有任何变量。它是一个实现Runnable()的抽象类。MainProcess.run()直接从Application.mainRun()调用,因为它不应该在另一个线程中运行。我试图用所有相关类的精简版本来运行上面的代码,但到目前为止,我还无法重现这个问题。精简后的版本按预期工作,这就是我没有将它们附加到问题的原因。如果使用内部类(我用一个示例更新了上面的答案),会怎么样?这有用吗?是的,有用。我想没有人会喜欢这种变通方法,但这总比根本无法调试要好。谢谢。不客气,很高兴它起作用了。再次,我建议您尽可能避免匿名类。它们编写速度更快,但会导致混乱,使代码更难阅读。