我正在开发一个自定义的Exception类,其中我有以下构造函数:
public class UserException extends Exception
{
string message;
public UserException() {
super();
}
public UserException(String message, Throwable cause)
{
super(message, cause);
this.cause = cause;
this.message = message;
}
}
我创建了一个新的自定义异常:
private Camera.PreviewCallback SetPreviewCallBack() throws UserException {
.......
// Something went wrong
throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
}
但是当我插入throw new UserException(...)
时,它会告诉我用try/catch
包围它!这不是主意,不是吗?我希望在需要抛出自定义异常时抛出自定义异常,而不会使new Exceptions
更多try/catch
条款。
那么,我做错了什么?我误解了什么?
答案 0 :(得分:18)
除了Eran的回答,您还可以使自定义异常扩展RuntimeException
,而不需要捕获。
答案 1 :(得分:9)
如果抛出此异常的方法没有处理它(即它没有捕获它),它必须在throws
子句中声明它,因为这是一个经过检查的异常。
public void yourMethod () throws UserException
{
...
throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
...
}
答案 2 :(得分:5)
如果您的自定义异常从Exception类延伸,则必须将其处理(使用try-catch
)或传递给调用者(使用throws
)。如果您只想将其留给运行时来处理异常,则需要从RuntimeException Class扩展它
从你的场景中的第一个案例开始,你应该做这样的事情:
public void surroundingMethod() throws UserException{
throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
}
这实际上会将您的异常传递给调用者,因此现在调用者有责任使用try-catch处理它或者再次传递它。
所以再次,你需要修改调用指令为
public void callingMethod () {
try {
surroundingMethod();
} catch (UserException ex){
}
}
答案 3 :(得分:3)
您应该将方法声明为throws UserException
- 或者将您的例外扩展为RuntimeException
。
后者是官方未经修改的,但通常用于绕过java's declared exception mechanism。
答案 4 :(得分:2)
在Java中,当您throw
选中 Exception
时,您还需要做一件事:
1。在try-catch
周围添加throw
块,并在同一方法中处理此Exception
。
2. 或者在方法定义中添加throws
语句,将处理Exception
的责任转移到更高级别的方法。
这是模块化和整体OOP范式的一部分。抽象:谁负责处理Exception
,方法的调用者或方法本身?答案取决于Exception
的性质。