Java Try Catch块

时间:2016-02-10 16:57:35

标签: java vb.net error-handling try-catch

我最初在大学开始编程并学习了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中捕获两次,以及各自捕获的捕获量是多少。

感谢。

2 个答案:

答案 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.