在我的课程中,我有一个我的方法使用的私有变量,它有一个必须被捕获的异常。
如何强制被调用者处理异常而不让我在代码中执行此操作?
public class SomeLibImpl extends SomeLib {
private Mongo _mongo = new Mongo();
}
Mongo会抛出我必须处理的UnknownHostException
。
如果这是我不应该做的事情,请告诉我更好的方法,但我也想知道如何强制类的被调用者来处理异常。
我以为我会这样做:
public class SomeLibImpl extends SomeLib throws UnknownHostException {
// ..
}
但那不会编译。
答案 0 :(得分:4)
使用throws
是强制调用者处理异常所需要做的。你的问题是你把它放在你的班级声明上。方法可以抛出异常,类不能。
答案 1 :(得分:2)
您需要了解checked
与unchecked例外的区别。
使用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)
您可以在构造函数中初始化该字段,并使构造函数抛出一个已检查的异常。