为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2023-03-23 16:12:14
我目前正在准备考试并正在执行以下任务:我想捕获“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]));感谢您的帮助!
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

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


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


这就像先过马路,然后检查是否有汽车驶来。您要么在检查交通情况之前就已经遇到路障,要么如果您已经安全地过马路,检查现在就没有意义了。


所以,换个角度吧。


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


将抛出NullPointerExceptionif valuesis null,并将抛出ArrayIndexOutOfBoundsExceptionif valuesis an empty array。


更一般地说,这个:


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. 更长

这只是它出了什么问题的一个例子。


查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号