2015-02-24 85 views
6

我正在开发一个自定义异常类,在其中我有以下构造函数:掷自定义异常

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

你在哪里与此达成? – 2015-04-25 12:23:02

回答

13

除了叶兰的答案,你也可以让你的自定义异常延长RuntimeException,它不需要被抓获。

+0

非常感谢!!!!!当扩展Exception不能编译时,扩展RuntimeException适用于我的custome错误。我无法弄清楚如何抑制“未处理的异常”消息。切换异常类型的窍门! – 2017-01-15 18:27:54

6

如果抛出此异常的方法无法处理它(即它没有捕获它),则它必须在throws子句中声明它,因为这是一个检查异常。

public void yourMethod() throws UserException 
{ 
    ... 
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed))); 
    ... 
} 
+0

我这样做,它仍然要求我试着抓住它。 – Sonhja 2015-02-24 10:34:55

+0

@Sonhja看到我的答案为第二部分。 – Ankit 2015-02-24 10:45:09

3

如果您的自定义异常来自Exception类扩展,它必须(使用try-catch)进行处理或到主叫(使用throws)通过。如果你只是想离开它运行时处理异常,你需要将其从 RuntimeException类扩展自您的方案第一种情况下,你应该做这样的事情:

public void surroundingMethod() throws UserException{ 
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed))); 
} 

这将主要通过你对调用者的例外,所以现在调用者有责任用try-catch来处理它,或者再次传递它。

如此反复,U需要修改调用指令为

public void callingMethod() { 
    try { 
     surroundingMethod(); 
    } catch (UserException ex){ 
    } 
} 
2

在Java中,当你throw一个检查Exception,有您需要做一两件事:

包括在同加try-catchthrow周围和处理这个Exception方法。

2.或者添加throws语句的方法定义,转移为对Exception的处理到一个更高的层次法的责任。

这是模块化的整体OOP范例的一部分&抽象:谁负责处理方法或方法本身的调用者Exception?答案取决于Exception的性质。