有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在try/finally中,try中的内容重要吗?

有什么功能上的区别吗

Connection c = null;
try {
  c = getConnection();
  c.doStuff();
} finally {
  if (c!=null) c.close();
}

vs

Connection c = null;
c = getConnection();
c.doStuff();
try {
} finally {
  if (c!=null) c.close();
}

vs

Connection c = null;
try {
  c = getConnection();
} finally {
  if (c!=null) c.close();
}
c.doStuff();

我觉得他们在任何情况下都会做同样的事情


共 (1) 个答案

  1. # 1 楼答案

    克雷格已经提到了未处理的异常问题,但我想说清楚。我编写了两个示例(最后一个示例很糟糕,因为在发生异常后,您可能正在处理断开的连接,不要这样做)。下面是一个抛出ArrayIndexOutOfBoundsException的简单示例:

    class TryCatchFinally {
        static int [] array = new int[1];
        public static void main(String [] args) throws Exception {
            if (args[0].startsWith("1")) {
                version1();
            } else if (args[0].startsWith("2")) {
                version2();
            }
        }
        static int version1() {
            int r = 0;
            try {
                System.out.println("In Try.");
                return array[1];
            } catch (Exception e) {
                System.out.println("In Catch.");
            } finally {
                System.out.println("In Finally.");
            }
            System.out.println("In Return.");
            return r;
        }
        static int version2() {
            int r = array[1];
            try {
                System.out.println("In Try.");
            } catch (Exception e) {
                System.out.println("In Catch.");
            } finally {
                System.out.println("In Finally.");
            }
            System.out.println("In Return.");
            return r;
        }
    }
    

    以下是执行情况:

    (TryCatchFinally)$ javac *.java
    (TryCatchFinally)$ java TryCatchFinally 1
    In Try.
    In Catch.
    In Finally.
    In Return.
    (TryCatchFinally)$ java TryCatchFinally 2
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at TryCatchFinally.version2(TryCatchFinally.java:24)
        at TryCatchFinally.main(TryCatchFinally.java:7)
    (TryCatchFinally)$
    

    正如您在第一个版本中看到的,由于异常发生在try块的上下文中,所以注册了异常处理程序。在第二个版本中,没有注册的异常处理程序,并且调用了默认的异常处理程序(表示未捕获的异常)