如何强制类的调用者捕获异常?

时间:2011-12-03 15:58:48

标签: java exception-handling

在我的课程中,我有一个我的方法使用的私有变量,它有一个必须被捕获的异常。

如何强制被调用者处理异常而不让我在代码中执行此操作?

public class SomeLibImpl extends SomeLib {

   private Mongo _mongo = new Mongo();

}

Mongo会抛出我必须处理的UnknownHostException

如果这是我不应该做的事情,请告诉我更好的方法,但我也想知道如何强制类的被调用者来处理异常。

我以为我会这样做:

public class SomeLibImpl extends SomeLib throws UnknownHostException {
  // ..
}

但那不会编译。

6 个答案:

答案 0 :(得分:4)

使用throws是强制调用者处理异常所需要做的。你的问题是你把它放在你的班级声明上。方法可以抛出异常,类不能。

答案 1 :(得分:2)

您需要了解checkedunchecked例外的区别。

使用checked checked来强制方法的调用者处理异常 你强迫他,因为如果调用代码不处理它将无法编译的异常(与未经检查的异常不同)

在您的情况下,在您的方法中声明带有已检查异常的throws将会执行此操作。

答案 2 :(得分:2)

要么在构造函数中初始化mongo,要将throws子句放在构造函数上,要么将它传递给构造函数(注入它)。

e.g。

public class Foo extends Bar {
  private Mongo mongo;
  public Foo() throws SomeException { 
    mongo = new Mongo();
  }
  // stuff goes here
}

或者你可以把对象注入你的......

public class Foo extends Bar {
  private Mongo mongo;
  public Foo(Mongo mongo) { 
    this.mongo = mongo;
  }
  // stuff goes here
}

第二种对象构造方式(依赖注入)优于在类中初始化,因为如果要对对象执行测试但不希望依赖于数据库,它允许您替换其他对象为此,您可以注入对象的存根(或模拟)版本并单独测试您的对象。

此外,您无法强制类的用户处理代码抛出的异常。即使你抛出一个已检查的异常,它们也可以忽略它,或者只是声明它们的方法也抛出异常,这会将buck传递给任何调用它们的代码。

答案 3 :(得分:2)

只需将其添加到您的班级

public SomeLibImpl() throws UnknownHostException {
}

答案 4 :(得分:1)

您将throws关键字添加到方法签名,而不是类定义。

public class SomeLibImpl extends SomeLib {
  public void someMethod() throws UnknownHostException {
    //
  }
}

答案 5 :(得分:1)

您可以在构造函数中初始化该字段,并使构造函数抛出一个已检查的异常。