【问题标题】:concrete class method keeps throwing an exception from abstract class despite implementation尽管实现,具体类方法不断从抽象类抛出异常
【发布时间】:2012-01-09 13:05:37
【问题描述】:

我有一个抽象类汽车,它有一个未实现的方法,称为 move 所以

public abstract class Automobile {
   public void move() {
       throw new UnsupportedOperationException();
   }
}

我有一个具体的类,它扩展了我的抽象类并实现了 move 方法。我的问题是该方法不断抛出 UnsupportedOperationException

public class Car extends Automobile{
  int x; 
   public void move(){
    x++;
   }
}

【问题讨论】:

  • 呃……那是因为你明确地抛出了一个异常。我建议你重新考虑你的抽象。
  • 请也显示具体类的代码。
  • 为什么要在抽象类中创建 move() 的实现而不是使其抽象化?
  • 你是怎么调用派生类的overriding方法的?
  • 在 Car 的 move() 实现之前添加一个 @Override 注释。此外,发布调用代码和堆栈跟踪。不要吝啬信息。

标签: java class exception abstract


【解决方案1】:

在你的具体类中可能有很多原因:也许你的具体并没有真正扩展Foo?或者它可能在它身体的某个地方调用super.move()

不抛出异常,正确的做法是将类和方法定义为abstract,强制子类覆盖它。

public abstract class Foo {
    public abstract void move();
}

请注意,如果Foo 仅具有抽象方法,如上例所示,那是您想要的interface,而不是抽象类。另外,你应该命名它来定义一个行为

public interface Moving { 
    void move();
}

然后:

public class MovingObject implements Moving {
    ....
    @Override
    public void move() {
       // your implementation
    }
    ....
}

【讨论】:

  • 我的抽象类有一些实现方法。我扩展抽象类的具体类有具体实现
  • 好吧 :) 你应该发布实现的代码,至少是 move() 方法的代码,以及调用代码,这样我们就可以看到它抛出异常的原因。我的猜测是在 super.move()
  • 我已经在我的代码中添加了一个实现,请看一下
  • 在基类中抛出异常并没有错。有关示例,请参见 java.util.AbstractList。 Java 的 Collections 框架包含许多可选操作。我承认,汽车将 move() 作为可选操作的给定情况似乎很奇怪。我想我什至可以处理 Yugo 扩展汽车的情况,而不会抛出 UnsupportedOperationException。尽管如此,OP 的实现并没有错。
  • 请编辑您的问题以包含调用代码和您收到的堆栈跟踪。那么我们或许可以帮助您。
【解决方案2】:

你在你的实现类中调用 super.move() 吗?如果您使用 Source->Override/Implement Methods...,则 Eclipse 默认会生成该调用...

否则我认为,您没有正确覆盖该方法。

【讨论】:

  • 不,我没有使用 super.move()。在我扩展抽象类的类中,我有该方法的具体实现
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多