2013-02-04 121 views
1

我在Eclipse應用程序下面的代碼:的Java匿名內部類中調用靜態方法

import org.eclipse.swt.widgets.Listener; 
public class X { 
    public void test() { 
    Listener eclipseListener = new Listener() { 
     public void handleEvent(Event evt) { 
      System.err.println("starting"); 
      Y.externalMethod(); 
      System.err.println("finished"); 
     } 
    } 
} 

public class Y { 
    public static void externalMethod() { 
     System.err.println("in class Y"); 
    } 
} 

當我在課堂X上運行的方法測試,我得到以下的輸出:

起始

我不明白爲什麼externalMethod沒有ru n在類Y中,爲什麼控制沒有返回到類X(它從不打印'完成'或'在類Y'中)。

有關爲什麼externalMethod無法運行的任何想法?匿名內部類是不允許在其類之外調用靜態方法的嗎?如果是這樣,爲什麼這個代碼編譯?

+0

如果您只是添加'eclipseListener.handleEvent(null)'並運行它,您發佈的內容就可以正常工作。你能生成一個SCCE嗎?可以很好地找到這個過程中的實際問題。 – Affe

回答

1

而不是

public void handleEvent(Event evt) { 
     System.err.println("starting"); 
     Y.externalMethod(); 
     System.err.println("finished"); 
    } 

你可能有更好的運氣:

public void handleEvent(Event evt) { 
     System.err.println("starting handleEvent"); 
     try { 
      Y.externalMethod(); 
     } finally { 
      System.err.println("finished handleEvent"); 
     } 
    } 

也就是說,

  1. 把方法退出跟蹤在finally
  2. Add方法名痕跡線
+0

非常有趣的想法。當我嘗試它時,finally分支中的代碼執行。我也嘗試在externalMethod上添加一個catch Exception E,但它沒有捕獲任何東西。 – David

+0

然後你需要用外部方法做同樣的事情。也許它拋出了'RuntimeException'或'Error'? –

+0

當我在Y.externalMethod中的代碼周圍添加try/catch/finally時,它們都沒有打印(不是catch或finally方法中的代碼)。 – David

0

此處不調用方法handleEvent()。你所做的是定義匿名類,並從中創建一個實例。

您需要將此偵聽器(eclipseListener)註冊到某個事件處理程序,該事件處理程序將在事件觸發時調用方法handleEvent()

+0

這實際上是一個更大的eclipse插件事件處理程序。 handleEvent方法在通過單擊按鈕執行偵聽器時執行。當我執行該方法時,我得到所有調試行,直到我調用外部類中的靜態方法。外部類中的靜態方法沒有參數,它的第一行是一條不打印的調試消息。 – David