无法检索'this'的正确封闭实例

时间:2012-07-17 09:45:32

标签: java eclipse debugging jboss

不幸的是,我无法发布完整的代码,但我无法使用较小的样本重现它。 我希望这个解释就足够了。

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

Evaluation failed. Reason(s):
Unable to retrieve the correct enclosing instance of 'this'

变量视图的前2个级别如下所示:

this    MENU$1  (id=291)    
   this$0   MENU  (id=292)  
   this$0   MENU  (id=292)  

无论出于何种原因,这两个$ 0条目具有相同的ID。

我可以在变量视图中观察var的值,但是我无法在显示或表达式视图中或直接在代码中执行“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()的调用流程有点奇怪,我可以提供的是这个堆栈跟踪:

 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'

代码在JBoss 4应用程序服务器中运行。

1 个答案:

答案 0 :(得分:1)

通过这个声明:

    ...
    this.main("menup",
        new MainProcess() {
            public void run() {
                System.out.println(var); // breakpoint here
                ...

您创建一个扩展/实现MainProcess的匿名类(取决于它是类还是接口)。通常,匿名类应该能够使用MENU.this.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
         ...
     }
 }
}