【问题标题】:Variables accessible to anonymous inner class in JavaJava中匿名内部类可访问的变量
【发布时间】:2013-04-19 19:46:13
【问题描述】:

我想使用匿名内部类来处理程序中对象的鼠标操作。但是,根据参数,我希望内部类的行为有所不同。例如:

Rectangle r1 = rectangleBuilder (Color.Red);
Rectangle r2 = rectangleBuilder (Color.Blue);

public Rectangle rectangleBuilder (final Color c) {
    r = new Rectangle (100, 100, c);

    r.dragListener = new DragListener () {
        @Override
        public void drag (double x, double y) {
            if (c == Color.Red) {
                r.setPosition (x, y);
            }
            if (c == Color.Blue) {
                r.setPosition (2 *x, 2 *y);
            }
        }
    }

    return r;
}

这个想法是,在创建对象时,拖动对象时的行为由其颜色决定。这工作正常,但现在由于某种原因,我收到一个异常,说 c (Color) 为空。我想知道这种方法在Java中是否可行。

【问题讨论】:

  • 如果 c 为空,这里不会抛出异常;错误发生在哪一行?
  • 有人将它传递给 rectangleBuilder() 时是否为空?听起来这就是问题所在......
  • 恐怕c确实是null;它与这种方法完全无关,因为它只影响r = new Rectangle (100, 100, c);
  • 是的,如果变量是最终的,则可以传递变量!看来您正在将 null 作为参数传递给该方法。
  • 当我在内部类中放置一个断点时,我发现 c 为空。这意味着决定如何设置位置的逻辑不起作用。当它传递给 rectangleBuilder 时,它绝对不为空。

标签: java anonymous-inner-class


【解决方案1】:

原来这是一个与 Java 完全无关的奇怪问题。枚举 Color 在另一个发生编译错误的类中。显然 Eclipse 将 Color 类的每个实例都视为 null。

【讨论】:

  • 这听起来很un——很奇怪,并且与 Java 非常相关。
  • 如果包含在另一个类中的静态枚举在与枚举无关的地方有编译错误,它是否标准为始终为空?
  • 我会说这听起来很奇怪。
  • 可能有一点,但如果类不能编译,我不知道会发生什么。
【解决方案2】:

如果jvm说有一个空指针,就说明这个指针是空的。使用此处的代码,只有一个解决方案是使用空指针调用的。检查堆栈跟踪,您会发现使用空对象调用此方法的位置。

如果你的指针为空是正常的,你可以定义一个默认颜色。

if (c == null)
    r = new Rectangle(100, 100, Color.black);

并在 drag() 方法中处理这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多