Java 专业程序员使用哪种风格,使用try-and-catch还是在代码中添加错误处理?

Java 专业程序员使用哪种风格,使用try-and-catch还是在代码中添加错误处理?,java,error-handling,runtime-error,Java,Error Handling,Runtime Error,哪一个应该优先于另一个?例如: 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) {
        if(index < 0 || index >= 5) {
            System.out.println("Index out of bounds");
        } else {
            A[index] = item;
        }
    }
}

ArrayIndexOutOfBoundsException
是运行时异常


在第一个代码段中抛出一个
IllegalArgumentException
,对输入进行清理更有意义。

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


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

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

原因是它使代码的逻辑更加清晰:可以为一般情况编写方法(而不必费心解决错误代码之类的问题),并且只有少数实际具有足够上下文来处理异常情况的方法也会包含这样做的代码

您的示例没有演示我所说的内容,因为您在异常发生的同一级别捕获了异常。在实践中,异常是有用的,因为它们被抛出到上面的几个级别,其中一些甚至达到了程序的顶层,中止了该级别以后将调用的所有方法

以下解释有望在正确使用异常时对异常的重要性有所帮助:

首先,考虑一个错误消息:<代码>数组索引越界< /代码>对用户来说毫无意义。即使只是简单地显示另一种错误消息,例如说正在读取的文件的格式不正确,即使它是(由您的程序)从数组被越界访问的事实中推断出来的,也更有用。但是您不能仅仅更改数组的

set
方法中的错误消息,因为它没有任何意义-数组用于许多事情,越界索引尝试可能意味着许多不同的事情(取决于到达那里的流的方式)。只有在调用层次结构中足够高的方法才知道每种异常的实际含义

第二,让异常传播到更高的级别,可以让程序更好地解释问题,并可能尝试另一种操作过程,可能根本不会打扰用户

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

因此,为了回答您的问题,通常针对您问题中的特定示例的正确(实际)方法是

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

您必须在更高级别上处理异常。如果您想要一种在这些情况下决定做什么的通用方法,.

我可能会使用第一种方法(但在超出边界时抛出一个IllegalArgumentException)。如果规范真的说只打印“索引超出范围”,我会说这两种方法都是可读的/可维护的/容易获得的,所以在我看来,任何一种都是好的。你从哪里读到不应该捕获运行时异常的?更正了。我的意思是,捕获运行时异常并记录它没有多大意义。它们在行为上是相同的:它们都是不需要也不应该被抓住的垃圾。+1保持清晰和简单,不要发明错误条件不太可能被正确处理。
void setArray(int item, int index) {
    A[index] = item;
}