在Java / Android中抛出自定义异常

时间:2015-02-24 10:30:26

标签: java android exception exception-handling

我正在开发一个自定义的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条款。

那么,我做错了什么?我误解了什么?

5 个答案:

答案 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的性质。