为什么不能在通用 catch 子句中捕获自定义异常
why cant custom Exception be caught in generic catch clause
请在下面检查我的自定义异常:
public class ReportException extends Exception {
private int mCode = -1;
private String mString = "";
public ReportException(int code, String description)
{
super(description);
mCode = code;
mString = description;
}
public int getCode()
{
return mCode;
}
public String getString()
{
return mString;
}
}
我的问题是为什么这在另一个 class:
中是非法的
try{
throw new NullPointerException();
}
catch(ReportException e){
}
对我来说,NullPointerException 是从 Exception class 派生的,我的自定义 ReportException 也是如此,因为有相同的类型,我希望它可以在 catch 子句中捕获。但是我的 IDE 说这是非法的。我和我的一位同事进行了讨论,他说那是不可能的,但我只是想知道为什么,因为它们都来自同一个异常 class。这看起来违背了多态性。
try
块中的某些代码必须先抛出已检查的异常,然后才能显式捕获它。
这是有效的:
try {
throw new ReportException();
}
catch(ReportException e){
// handle it
}
见Java: checked vs unchecked exception explanation
A NullPointerException
和你的 ReportException
都是 Exception
,但是要捕获 ReportException
,你必须抛出 ReportException
(或子类). NullPointerException
不是 ReportException
的子类,因此未被捕获。
改为 ReportException
。
java 中的每个 class 都是 java.lang.Object 的继承者,但这并不意味着所有这些 class 都可以转换为每个 class -其他.
对于计算机来说,这两个 class 完全不同。
请在下面检查我的自定义异常:
public class ReportException extends Exception {
private int mCode = -1;
private String mString = "";
public ReportException(int code, String description)
{
super(description);
mCode = code;
mString = description;
}
public int getCode()
{
return mCode;
}
public String getString()
{
return mString;
}
}
我的问题是为什么这在另一个 class:
中是非法的try{
throw new NullPointerException();
}
catch(ReportException e){
}
对我来说,NullPointerException 是从 Exception class 派生的,我的自定义 ReportException 也是如此,因为有相同的类型,我希望它可以在 catch 子句中捕获。但是我的 IDE 说这是非法的。我和我的一位同事进行了讨论,他说那是不可能的,但我只是想知道为什么,因为它们都来自同一个异常 class。这看起来违背了多态性。
try
块中的某些代码必须先抛出已检查的异常,然后才能显式捕获它。
这是有效的:
try {
throw new ReportException();
}
catch(ReportException e){
// handle it
}
见Java: checked vs unchecked exception explanation
A NullPointerException
和你的 ReportException
都是 Exception
,但是要捕获 ReportException
,你必须抛出 ReportException
(或子类). NullPointerException
不是 ReportException
的子类,因此未被捕获。
改为 ReportException
。
java 中的每个 class 都是 java.lang.Object 的继承者,但这并不意味着所有这些 class 都可以转换为每个 class -其他.
对于计算机来说,这两个 class 完全不同。