我最初在大学开始编程并学习了vb.net。现在我决定转向Java并进行一些查询。在vb中,try catch语句的布局如下
try
Catch ex as exception
finally
End catch
但是来自java网站(https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html) 我发现在java中你使用两个类似的捕获:
try {
} catch (ExceptionType name) {
} catch (ExceptionType name) {
}
我希望有人可以解释为什么你需要在Java中捕获两次,以及各自捕获的捕获量是多少。
感谢。
答案 0 :(得分:6)
在Java中,可以使用多个catch
块。
这并不一定意味着你必须这样做。
这取决于您在try
块中的代码,以及它可能会抛出的Exception
多少{(1}}如果您真的想要抓住它{甚至未经检查Exception
,通常你没有,你没有必须)。
一个糟糕做法是对一般Exception
(或更糟,Throwable
使用单个处理程序,这也会捕获RuntimeException
和{{1 }} S):
Error
良好做法是捕获所有可能被抛出的已检查 try {
// stuff that throws multiple exceptions
}
// bad
catch (Exception e) {
// TODO
}
。
如果其中一些在继承方面是相关的,那么总是首先捕获子类(即更具体的Exception
),以免代码编译:
Exception
另请查看Java 7的multi-catch blocks,其中可以同时捕获不相关的try {
// stuff that throws FileNotFoundException AND IOException
}
// good: FileNotFoundException is a child class of IOException - both checked
catch (FileNotFoundException fnfe) {
// TODO
}
catch (IOException ioe) {
// TODO
}
,并在每个Exception
类型之间使用|
分隔符:
Exception
注意强>
在您链接的this示例中,将所有内容放在一起下面的第一个代码段可能被认为是次优的:确实抓住了可能抛出try (optionally with resources) {
// stuff that throws FileNotFoundException and MyOwnCheckedException
}
// below exceptions are unrelated
catch (FileNotFoundException | MyOwnCheckedException e) {
// TODO
}
,但其中一个是Exception
,这是一个IndexOutOfBoundsException
(未选中),理论上不应该处理。
相反,RuntimeException
变量(或可能是常量)应该被对正在迭代的SIZE
的大小的引用所取代,即List
,以防止{{1}被抛出
我想在这种情况下,它只是提供一个例子。
答案 1 :(得分:2)
链接i中页面上的代码已修改它,但有一个例外。这里的问题是,在这种情况下,您将无法知道异常是否由于
IndexOutOfBoundsException或IOException
只是你知道发生了异常
import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class ListOfNumbers {
public static void main(String... s) {
ListOfNumbers lon = new ListOfNumbers();
lon.writeList();
}
private List<Integer> list;
private static final int SIZE = 10;
public ListOfNumbers() {
list = new ArrayList<Integer>(SIZE);
for (int i = 0; i < SIZE; i++) {
list.add(new Integer(i));
}
}
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering" + " try statement");
out = new PrintWriter(new FileWriter("e://OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
} catch (Exception e) {
System.err.println("Caught Exception: " + e.getMessage());
} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
}
}
}
让我们理解这个概念,最好知道代码为什么会因为哪种特殊类型的异常而失败
IndexOutOfBoundsException或IOException
现在代码处理不同的异常
import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class ListOfNumbers {
public static void main(String... s) {
ListOfNumbers lon = new ListOfNumbers();
lon.writeList();
}
private List<Integer> list;
private static final int SIZE = 10;
public ListOfNumbers() {
list = new ArrayList<Integer>(SIZE);
for (int i = 0; i < SIZE; i++) {
list.add(new Integer(i));
}
}
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering" + " try statement");
out = new PrintWriter(new FileWriter("e://OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
} catch (IndexOutOfBoundsException e) {
System.err.println("Caught IndexOutOfBoundsException: " +
e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
}
}
}
在这里,我们可以知道它是否由于在位置
创建文件而失败E://OutFile.txt 驱动器不在我的系统上
错误打印为
捕获异常:e:\ OutFile.txt(系统无法找到路径 指定)输入try语句PrintWriter未打开
下一个案例
现在我评论该行
list.add(new Integer(i));
import java.io.*;
import java.util.List;
import java.util.ArrayList;
public class ListOfNumbers {
public static void main(String... s) {
ListOfNumbers lon = new ListOfNumbers();
lon.writeList();
}
private List<Integer> list;
private static final int SIZE = 10;
public ListOfNumbers() {
list = new ArrayList<Integer>(SIZE);
for (int i = 0; i < SIZE; i++) {
// list.add(new Integer(i));
}
}
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering" + " try statement");
out = new PrintWriter(new FileWriter("OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
} catch (IndexOutOfBoundsException e) {
System.err.println("Caught IndexOutOfBoundsException: " +
e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
}
}
}
然后它清楚地说它没有索引超出约束的异常
输入try语句Caught IndexOutOfBoundsException:Index:0, 大小:0关闭PrintWriter
因此,为了正确有效地调试应用程序,这是好事。
我为其他类型的异常
创建了条件NoClassDefFoundError
java.lang.NoClassDefFoundError: ListOfNumbers
Caused by: java.lang.ClassNotFoundException: stackprac.ListOfNumbers
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Exception in thread "main" Process exited with exit code 1.