【问题标题】:Java Anonymous Inner Class Calling Static MethodJava匿名内部类调用静态方法
【发布时间】:2013-02-04 22:27:20
【问题描述】:

我在 Eclipse 应用程序中有以下代码:

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 没有在 Y 类中运行以及为什么控制没有返回到 X 类(它从不打印“完成”或“在 Y 类中”)。

关于为什么 externalMethod 不运行的任何想法?匿名内部类是否不允许在其类外调用静态方法?如果是这样,为什么这段代码会编译?

【问题讨论】:

  • 如果您只添加 eclipseListener.handleEvent(null); 并运行它,您发布的内容就可以正常工作。你能生成一个 SCCE 吗?很可能在过程中发现实际问题。

标签: java eclipse anonymous-inner-class


【解决方案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. 将方法名称添加到跟踪行

【讨论】:

  • 非常有趣的想法。当我尝试它时,finally 分支中的代码确实执行了。我还尝试在 externalMethod 周围添加一个 catch Exception e,但它没有捕获任何东西。
  • 那么你需要用外部方法做同样的事情。也许它正在抛出RuntimeExceptionError
  • 当我在 Y.externalMethod 中的代码周围添加 try/catch/finally 时,它们都没有打印出来(不是 catch 或 finally 方法中的代码)。
  • 你的意思是方法的入口被打印了,但出口没有?也许它有一个jvm错误?不过这很不寻常。你能发布它的代码或调试吗?
【解决方案2】:

这里没有调用方法handleEvent()。您所做的是定义匿名类并动态创建一个实例。

您需要将此侦听器 (eclipseListener) 注册到某个事件处理程序,该事件处理程序将在事件触发时调用方法 handleEvent()

【讨论】:

  • 这实际上是在一个更大的 Eclipse 插件事件处理程序中。当通过单击按钮执行侦听器时执行handleEvent 方法。当我执行该方法时,我会得到所有调试行,直到我在外部类中调用静态方法。外部类中的静态方法没有参数,第一行是不打印的调试消息。
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 2016-08-05
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多