在java中为什么自定义exception也应该有一个构造函数,其中arg为’Throwable cause’
任何人都可以在定义自定义exception时解释为什么我们应该有如下的构造函数:
public MyException(Throwable cause) { super(cause); } public MyException(String message, Throwable cause) { super(message, cause); }
它允许您添加有关抛出该exception的原因的自定义Exception实例信息。
当你捕获一个exception并抛出另一个exception时,它很有用。
例如 :
try { .... } catch (SomeException ex) { throw new MyException ("some message", ex); }
正如你的问题所提到的那样, 应该将上面提到的构造函数实现到MyException
类,它是Exception
的子类但是只有那些构造函数并不是绝对必需的 。
你可以很好地拥有以下没有Throwable
作为参数的Throwable
函数:
public MyException() { super(); } public MyException(String message) { super(message); }
但是这些构造函数有一个缺点。 考虑以下代码假设在类MyClass
:
public static void myMethod() throws MyException{ //Some code }
现在在一些代码中,你将这个myMethod()
称为如下所示:
try{ MyClass.myMethod(); } catch (MyException e){ e.getCause(); }
如果你使用构造函数和我的答案中陈述的构造函数, e.getCause()
将返回null
。 因此很难确定exception的确切原因是什么。