Java 如何捕获空数组[0](异常)
我目前正在准备考试,正在完成以下任务: 我想抓住“ArrayIndexOutOfBoundsException” 我有以下课程: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[
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();
}
}