解决异常处理问题

时间:2015-02-05 08:06:22

标签: java

为什么我们使用异常子类?如果我们只能处理异常异常类,比如:

try { 
}
catch(Exception e) { 
}

那么我们为什么要使用像ArithmeticExceptionArrayIndexOutOfBoundsException这样的子类?

8 个答案:

答案 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。对于catchesexpected等所有可能的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