在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的确切原因是什么。