0

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

如果我尝试在断点处从“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)  

无论出于何种原因,有 2 个 this$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.toString()
this.var 无法解析或不是字段
var 无法检索“this”的正确封闭实例
MENU.this.var 无法检索“this”的正确封闭实例

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

4

1 回答 1

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
         ...
     }
 }
}
于 2012-07-17T11:24:38.693 回答