3

哪个应该优先于另一个?例子:

class Example {
    int[] A = new A[5];

    void setArray(int item, int index) {
        if(index < 0 || index >= 5) {
            System.out.println("Index out of bounds");
        } else {
            A[index] = item;
        }
    }
}

还是这个?

class Example {
    int[] A = new A[5];

    void setArray(int item, int index) {
        try {
            A[index] = item;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Index out of bounds");
        }
    }
}
4

3 回答 3

3

当一种语言对异常有很好的支持时(如 C# 和 Java),抛出和捕获异常是处理异常情况的最常用方法。

原因是它使代码的逻辑更清晰:可以为一般情况编写方法(无需费心解决错误代码等),只有实际上有足够上下文来处理异常情况的少数方法也包含这样做的代码。

你的例子没有证明我在说什么,因为你已经在它发生的同一级别捕获了异常。在实践中,异常是有用的,因为它们被抛出了几个层次,其中一些甚至达到了程序的顶层附近,中止了随后将被该层次调用的所有方法。

当正确使用异常时,以下解释有望阐明异常的重要性:

首先,考虑到一条错误消息array index out of bounds对用户来说毫无意义。即使只是简单地显示另一种错误消息,例如一个说法the file being read has an incorrect format更有用,即使它是(由您的程序)从数组被越界访问这一事实推断出来的。但是您不能只更改set数组方法中的错误消息,因为它没有任何意义 - 数组用于许多事情,超出范围的索引尝试可能意味着许多不同的事情(取决于如何流量到达那里)。只有调用层次结构中足够高的方法才能知道每种异常的实际含义

其次,让异常传播更高的几个级别可以让您的程序更好地推理问题并可能尝试另一种行动方案,可能根本不会打扰用户。

第三,捕获异常并在如此低的级别显示错误消息根本不会让调用者方法知道发生了异常。这意味着程序的更高级别逻辑将继续其正常流程,就好像什么都没发生一样,认为到现在为止的每个操作都已成功。这是一种错误行为,其范围从相对无害到具有破坏性。

因此,要回答您的问题,通常您问题中特定示例的正确(实用)方法很简单

void setArray(int item, int index) {
    A[index] = item;
}

而且您必须在更高级别处理异常。如果您想要一种决定在这些情况下做什么的一般方法,请在此处阅读我的答案

于 2013-01-21T08:12:25.340 回答
2

ArrayIndexOutOfBoundsException是运行时异常。

在清理IllegalArgumentException输入的第一个代码片段中添加一个更有意义。

于 2013-01-21T07:59:37.683 回答
1

例外,尤其是未经检查的例外,适用于特殊情况。如果您可以预测故障点,请自行验证输入。对我来说唯一的例外是NumberFormatException,因为这显然很难验证自己。

未经检查的异常适用于 API 用户可能无法恢复的情况,但在这种情况下您显然可以。

于 2013-01-21T08:00:29.613 回答