首页 > 解决方案 > 如何捕获一个空数组[0](异常)

问题描述

我目前正在准备考试,正在处理以下任务:

我想捕捉“ArrayIndexOutOfBoundsException”。

我有以下课程:

class Util {

    // get the smallest number of the given array
    @SuppressWarnings("unused")
    public static int minimum(int[] values) {
        try {
            int min = values[0];
            if (values == null) {
                throw new NullPointerException();
            }

            if (values.length > 0) {
                for (int i = 1; i < values.length; i++) {
                    if (values[i] < min) {
                        min = values[i];
                    }
                }
                return min;
            } else {
                throw new ArrayIsEmptyException();
            }

        } catch (NullPointerException e) {
            System.out.println("Das ist kein Array");
        } catch (ArrayIsEmptyException e) {
            System.out.println("Das Array ist leer.");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }

并从主要:

public class UtilTest {

    // Testprogramm
    public static void main(String[] args) {

        System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[] { 1, 6, 4, 7, -3, 2 }));

        System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[0]));

        System.out.println(Util.minimum(null));
    }
}

我怎样才能捕捉到这个输出的异常:

System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[0]));

谢谢你的帮助!

标签: javaeclipse

解决方案


发生错误时,代码立即跳出。

在您的代码中,您所做的事情会在某些条件下导致错误(例如,如果数组变量没有指向任何内容(为空),或者它是一个空数组),然后您检查这些条件,这是没有意义的。

这就像先过马路,然后检查是否有车来。你要么在检查交通状况之前就已经是路人甲了,要么如果你已经安全过马路,那么检查现在毫无意义。

所以,换个方式吧。

具体来说,这段代码:int min = values[0];

将抛出一个NullPointerExceptionifvalues为 null,并将抛出一个ArrayIndexOutOfBoundsExceptionifvalues为空数组。

更一般地说,这是:

catch (Exception e) {
    e.printStackTrace();
}

非常糟糕的代码。对于初学者来说,这意味着代码将在错误发生后继续执行,因此即使有一件事情出错,通常您的日志也会充满大量错误消息,更重要的是,异常包含 5 个有用的信息:它的类型、它的消息、它的堆栈跟踪、其因果链以及附加到它的抑制异常批次。

最后一个通常不是特别有趣,但其他 4 个非常有用。你扔掉了 4 个有用的东西中的 3 个,只打印堆栈跟踪。除此之外,您在任何地方都以这种风格重复代码。

所以不要。

永远不要编写仅仅为了记录或打印异常而捕获异常的代码。只是..不要抓住它,让顶级异常处理程序(打印所有有用信息然后关闭线程,这是一个非常好的默认值)处理它。如果是已检查异常,请添加throws X到方法签名中,其中 X 是已检查异常。例如:

好代码:

public void deleteFile(String fileName) throws IOException {
    Files.delete(Paths.get(fileName));
}

错误代码:

public void deleteFile(String fileName) {
    try {
        Files.delete(Paths.get(fileName));
    } catch (IOException e) {
        System.err.println("Something went wrong deleting file!");
        e.printStackTrace();
    }
}

第二段代码:

  1. 打印无用的信息('出了点问题',是的,我知道,我正在查看异常)
  2. 使用不良风格;感叹号在错误消息中没有用。
  3. 代码静默继续,因此任何调用此方法的代码都无法判断删除失败。也可能会出现更多错误
  4. 丢弃大量信息;该 IOException 可能有一条消息,例如“文件被标记为只读”,您现在已将其丢弃。
  5. 长得多

这只是其中问题的一个示例。


推荐阅读