我目前正在准备考试并正在处理以下任务:
我想捕获“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;
}
Run Code Online (Sandbox Code Playgroud)
并从主要:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
我如何捕获此输出的异常:
System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[0]));
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
当发生错误时,代码立即跳出。
在您的代码中,您正在做的事情在某些条件下会导致错误(例如,如果数组变量不指向任何内容(为空),或者它是一个空数组),然后您检查这些条件,即毫无意义。
这就像先过马路,然后检查是否有车开过来。你要么在检查交通之前就已经是道路杀手,要么如果你已经安全地穿过街道,那么检查现在毫无意义。
所以,换个角度。
具体来说,这段代码: int min = values[0];
将抛出一个NullPointerExceptionifvalues为空,并抛出一个ArrayIndexOutOfBoundsExceptionifvalues是一个空数组。
更一般地,这:
catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
是非常糟糕的代码。对于初学者来说,这意味着代码将在错误发生后继续运行,因此通常即使出现 1 件事出错,您的日志也会充满大量错误消息,更重要的是,异常包含 5 位有用的信息:它的类型、它的消息、它的堆栈跟踪、它的因果链以及附加到它的一批被抑制的异常。
最后一个通常不是特别有趣,但其他 4 个非常有用。你扔掉了 4 个有用的东西中的 3 个,只打印了堆栈跟踪。除此之外,您还使用这种风格在任何地方重复代码。
所以不要。
永远不要编写捕获异常的代码只是为了记录或打印它。只是......不要抓住它,让顶级异常处理程序(打印所有有用的信息然后关闭线程,这是一个很好的默认值)处理它。如果是受检异常,则添加throws X到方法签名中,其中 X 是受检异常。例如:
好的代码:
public void deleteFile(String fileName) throws IOException {
Files.delete(Paths.get(fileName));
}
Run Code Online (Sandbox Code Playgroud)
错误代码:
public void deleteFile(String fileName) {
try {
Files.delete(Paths.get(fileName));
} catch (IOException e) {
System.err.println("Something went wrong deleting file!");
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
第二段代码:
这只是它问题的一个例子。
| 归档时间: |
|
| 查看次数: |
3539 次 |
| 最近记录: |