Java 如何捕获空数组[0](异常)

Java 如何捕获空数组[0](异常),java,eclipse,Java,Eclipse,我目前正在准备考试,正在完成以下任务: 我想抓住“ArrayIndexOutOfBoundsException” 我有以下课程: class Util { // get the smallest number of the given array @SuppressWarnings("unused") public static int minimum(int[] values) { try { int min = values[

我目前正在准备考试,正在完成以下任务:

我想抓住“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;
    }
如何捕获此输出的异常:

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

谢谢你的帮助

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

在代码中,在某些条件下(例如,如果数组变量不指向任何东西(为null),或者如果它是空数组),您所做的操作会导致错误,然后检查这些条件,这是毫无意义的

这就像先过马路,然后检查是否有车来。在检查交通状况之前,你可能已经在路上被撞死了,或者如果你已经安全地过了马路,检查现在就没有意义了

所以,换个角度

具体来说,此代码:
int min=value[0]

如果
values
为null,将抛出
NullPointerException
,如果
values
为空数组,将抛出
ArrayIndexOutOfBoundsException

更一般地说,这是:

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

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

所以不要

永远不要编写捕获异常的代码仅仅是为了记录或打印它。只是不要捕获它,让顶级异常处理程序(它打印所有有用的信息,然后关闭线程,这是一个非常好的默认值)来处理它。如果它是选中的异常,则向方法签名添加
抛出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();
    }
}
第二位代码:

  • 打印无用信息(“出了点问题”,是的,我知道,我看到了一个例外)
  • 使用不良风格;感叹号在错误消息中不起作用
  • 代码以静默方式继续,因此任何调用此方法的代码都无法判断删除失败。也可能会出现更多的错误
  • 扔掉大量的信息;该IOException可能有一条消息,如“文件标记为只读”,您现在已将其抛出
  • 要长得多

  • 这只是一个样本,说明它有什么问题。

    我不明白你的问题。就我所见,您已经捕获到了异常(如果您谈论的是
    ArrayIsEmptyException
    )。当然,您应该首先检查数组是否为空,然后才将min设置为第0个元素;如果(values==null){抛出新的NullPointerException();}
    没有多大意义。使用
    值[0]
    访问此处的数组时,您将遇到
    NullPointerException
    这通常不是一个好主意,因为这是一个例外,您应该避免“捕获”,而应该编写代码以避免。空数组没有索引0,您需要先检查长度。非常感谢您的详细解释。我会记住你的提示。首先,我必须说,我问这个问题有点不准确。我知道如何捕获异常。我想知道如何询问if查询以确定数组是否为空。arrayRef.length==0我想补充一点,您永远不应该因为某种原因抛出异常,然后捕获它并执行一些操作(我特别关注
    ArrayIsEmptyException
    NullPointerException
    )。直接做“某事”,不要抛出异常。
    public void deleteFile(String fileName) {
        try {
            Files.delete(Paths.get(fileName));
        } catch (IOException e) {
            System.err.println("Something went wrong deleting file!");
            e.printStackTrace();
        }
    }