为什么我们使用异常子类?如果我们只能处理异常异常类,比如:
try {
}
catch(Exception e) {
}
那么我们为什么要使用像ArithmeticException
,ArrayIndexOutOfBoundsException
这样的子类?
答案 0 :(得分:2)
因为抓住Exception
非常笼统,您如何知道它是ArrayIndexOutOfBoundsException
还是NullPointerException
?如果你想以不同的方式处理每一个怎么办?
示例:
try {
veryComplicatedLogic();
} catch(Exception e) {
// null pointer? out of bounds? custom exception?
}
抓住Exception
是非常糟糕的做法,尽量保持你的范围尽可能小,尽可能具体。
答案 1 :(得分:1)
因为如果你抓住Exception
,你会发现每一次失败 1 ...并且你无法编写能够在所有可能的失败的情况下(正确地)恢复的代码
提示:许多可能的异常可能是编程错误(一个错误!)无法安全恢复的结果。
1 - 不完全正确。要抓住所有内容,您需要抓住Throwable
答案 2 :(得分:1)
对不同类型的错误进行分类很有用,更重要的是整改步骤
例如
try { //read a file //write to a database }catch(IOException e1) { // catch block to do something about the file io error // and provide appropriate error message }catch(SQLException e2) { // catch block to do something about the SQL error // and provide appropriate error message }catch(Exception e3) { // catch block for any other exceptions, perhaps runtime exceptions }
答案 3 :(得分:0)
异常分类有助于在我们看到描述之前,轻松了解手头的问题究竟是什么。这是开发人员理解该问题的第一个线索。例如,如果你得到一个NullPointerException / ArithemeticException,如果你只是说“Exception Ocured”,我们能理解什么吗?没有详细解释。所以它是对错误进行分类的一种方法,但是当然,编码的开发人员通过错误描述给出了更详细的解释。
答案 4 :(得分:0)
所有例外都来自班级Exception
。对于catches
,expected
等所有可能的ArithmeticException
例外,我们可以有一系列ArrayIndexOutOfBoundsException
。
最后,我们可以使用类型为Exception
的参数。当上述expected
次出现之一出现时,它们将被其中一个相应的捕获物捕获。其他人将被最后Exception
(基类)
注意:基类异常可以捕获其所有派生类异常。所以当你有
时就没用了 catch(Exception) { . . .}
前面的
catch(someExp){. . . }
whew someExp
可以是ArithmeticException,ArrayIndexOutOfBoundsException
或任何其他user define ones
之类的任何例外。
编辑当我们知道specific
异常时,我们可以获取具体的异常详细信息并进行相应处理。这是使用导出其他异常
答案 5 :(得分:0)
如果你抓住了,在课程ArithmeticException
之前说Exception
,它首先会尝试捕获特定的ArithmeticException。如果取而代之的是NullPointerException
,它将跳过第一个捕获并转到第二个捕获。像这样:
try {
//Code here
} catch(ArithmeticException ame) {
//Do something to catch the ArithmeticException
} catch(Exception e) {
//Catch all remaining Exceptions
}
答案 6 :(得分:0)
Exception
是所有异常的超类因此,如果你使用它来捕获异常,那么它们将在程序员端出现问题,就好像其他程序员想要读取程序所以需要时间来查找哪个异常处理。
In short it is poor design.
答案 7 :(得分:0)
我通过一个例子介绍了公共(即只使用Exception类)和复杂(即使用Exception' s子类)异常处理之间的区别。
你必须实现一个方法,它接收字符串格式的两个正整数作为参数,将第一个除以第二个并返回该除法的整数部分。
有两个主要的可能错误来源:字符串中的数字格式错误,除以0。当然,该方法必须处理这些错误并将其指示给调用方法。
如果您对发生错误的原因不感兴趣,最好的方法是处理Exception对象:
int stringDiv(String str1, String str2)
{
try
{
int i1 = Math.abs(Integer.parseInt(str1));
int i2 = Math.abs(Integer.parseInt(str2));
return i1 / i2;
}
catch (Exception ex)
{
return -1;
}
}
...
System.out.println(stringDiv("114", "11")); //Output: 10
System.out.println(stringDiv("a114", "11")); //Output: -1
System.out.println(stringDiv("114", "0")); //Output: -1
但是如果你想向调用者方法指出输入的问题是什么,你必须单独处理所有异常类型:
static int stringDiv2(String str1, String str2)
{
try
{
int i1 = Math.abs(Integer.parseInt(str1));
int i2 = Math.abs(Integer.parseInt(str2));
return i1 / i2;
catch (NumberFormatException ex)
{
return -100;
}
catch (ArithmeticException ex)
{
return -200;
}
catch (Exception ex)
{
return -300;
}
}
...
System.out.println(stringDiv2("114", "11")); //Output: 10
System.out.println(stringDiv2("a114", "11")); //Output: -100
System.out.println(stringDiv2("114", "0")); //Output: -200