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)  

何らかの理由で、同じIDを持つthis$0エントリが2つあります。

変数ビューで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'の正しい囲んでいるインスタンスを取得できません

コードはJBoss4アプリケーションサーバーで実行されています。

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 に答える