在 Java/Android 中抛出自定义异常
Throw custom Exceptions in Java/Android
我正在开发一个自定义异常 class,其中我有以下构造函数:
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
包围它!!这不是主意,不是吗?我想在需要抛出自定义异常时抛出它们,而不是用更多 try/catch
子句包围我的 new Exceptions
。
所以,我做错了什么?我误会了什么?
如果抛出这个异常的方法没有处理它(即它没有捕获它),它必须在 throws
子句中声明它,因为这是一个已检查的异常。
public void yourMethod () throws UserException
{
...
throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
...
}
如果您的自定义异常扩展自 Exception class, it must be handled (using try-catch
) or passed on to caller (using throws
). If you just want to leave it to runtime to handle the exception, You need to extend it from 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){
}
}
除了 Eran 的回答之外,您还可以让您的自定义异常扩展 RuntimeException
,这不需要被捕获。
您应该将您的方法声明为 throws UserException
- 或者使您的异常扩展 RuntimeException
.
官方不建议使用后者,但通常用于绕过 java's declared exception mechanism。
在Java中,当您throw
一个检查 Exception
时,您还需要做一件事:
1. 在 throw
周围添加一个 try-catch
块并在同一方法中处理此 Exception
。
2. 或者在方法定义中添加一条throws
语句,将Exception
的处理责任转移给更高层方法。
这是模块化和抽象的整体 OOP 范例的一部分:谁负责处理 Exception
、方法的调用者或方法本身?答案取决于 Exception
.
的性质
我正在开发一个自定义异常 class,其中我有以下构造函数:
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
包围它!!这不是主意,不是吗?我想在需要抛出自定义异常时抛出它们,而不是用更多 try/catch
子句包围我的 new Exceptions
。
所以,我做错了什么?我误会了什么?
如果抛出这个异常的方法没有处理它(即它没有捕获它),它必须在 throws
子句中声明它,因为这是一个已检查的异常。
public void yourMethod () throws UserException
{
...
throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
...
}
如果您的自定义异常扩展自 Exception class, it must be handled (using try-catch
) or passed on to caller (using throws
). If you just want to leave it to runtime to handle the exception, You need to extend it from 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){
}
}
除了 Eran 的回答之外,您还可以让您的自定义异常扩展 RuntimeException
,这不需要被捕获。
您应该将您的方法声明为 throws UserException
- 或者使您的异常扩展 RuntimeException
.
官方不建议使用后者,但通常用于绕过 java's declared exception mechanism。
在Java中,当您throw
一个检查 Exception
时,您还需要做一件事:
1. 在 throw
周围添加一个 try-catch
块并在同一方法中处理此 Exception
。
2. 或者在方法定义中添加一条throws
语句,将Exception
的处理责任转移给更高层方法。
这是模块化和抽象的整体 OOP 范例的一部分:谁负责处理 Exception
、方法的调用者或方法本身?答案取决于 Exception
.