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

时间:2019-07-13 11:30:34

标签: java eclipse

我目前正在为考试做准备,并且正在执行以下任务:

我想捕获“ ArrayIndexOutOfBoundsException”。

我有以下课程:

Console.WriteLine(positiveRatio.ToString("0.000000");

并从主要方面:

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));
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

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

在您的代码中,您正在做的事情在某些情况下会导致错误(例如,如果数组变量指向空(为null),或者它为空数组),然后检查这些条件,这毫无意义。

这就像先过马路,然后检查是否有汽车驶来。在您检查之前,您已经已经杀死道路,或者,如果您已经安全地穿过马路,则检查毫无意义。

因此,将其切换。

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

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

更一般地说,这是

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

难以置信的错误代码。对于初学者来说,这意味着代码将在错误发生后继续运行,因此即使出现1个错误,您的日志中仍然充满了大量错误消息,更重要的是,异常包含5个有用的信息位:其类型,其消息,堆栈跟踪,其因果链以及附加的抑制异常。

最后一个通常不是特别有趣,但是其他四个非常有用。您将丢掉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. 更长了

那只是它出了什么问题的一个示例。