微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

避免try-catch-finally地狱

如何解决避免try-catch-finally地狱

假设我有简单的连接并从数据库中选择。这段代码的悲伤部分是几乎可以说 40-50% 是 try-catch 样板代码。我该如何处理?

$("#recipes").change(function() {
    $("#recipeDetailsDiv").show();
});

解决方法

避免try-catch-finally 地狱的方法是使用try-with-resources。它已添加到 Java 7 中的 Java 语言中。有关此 Java 语言功能的更详细说明,请参阅 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

这是使用 try-with-resources 的代码的样子

 public static void main(String[] args) throws Exception {
    String sql = "SELECT id,name from user";   
    try (Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost/test","root","root");
         Statement statement = connection.createStatement();
         ResultSet rs = statement.executeQuery(sql))
    {
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");

            System.out.print("ID: " + id);
            System.out.print(",name: " + name);
            System.out.println();
        }
    }
}

请注意,try-with-resources 将按照与此相反的顺序自动关闭每个声明的资源(connectionstatementrs)它们已被声明,并将适当处理在此期间可能出现的任何异常。所以我们不需要任何显式的 close() 调用。

如果这是生产代码,我们不应将 main 声明为抛出异常。我们应该妥善处理异常;即记录它们和/或产生用户友好的错误消息。我只是在这里走捷径……因为这是您原始问题的侧边栏。

,

您可以使用 try-with-resources 使您的代码更简洁,例如-

        try(Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost/test","root"
        );Statement statement = connection.createStatement()) {
         
            String sql = "SELECT id,name from user";
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");

                System.out.print("ID: " + id);
                System.out.print(",name: " + name);
                System.out.println();
            }
            rs.close();
        } catch (Exception se) {
            se.printStackTrace();
        }

它将处理关闭资源。有关详细信息,请访问 Oracle Docs

,

DataSource

使用您的所有连接详细信息(例如用户名和密码)设置一个 DataSource 对象。您的 JDBC driver 可能带有一个简单的实现。

SomeDataSourceImplementation ds = new SomeDataSourceImplementation() ;
ds.setUserName( "Scott" ) ;
ds.setPassword( "Tiger" ) ;
…
DataSource dataSource = ds ;

尝试资源语法

try-with-resources 语法是多年前添加的,以帮助简化此类代码。见Tutorial by Oracle

如果抛出异常,AutoCloseable 对象将按照它们列出的相反顺序关闭。

        String sql = "SELECT id,name from user";
        try (
            Connection conn = dataSource.getConnection() ;
            Statement statement = conn.createStatement() ;
            ResultSet rs = statement.executeQuery(sql) ;
        ) {
            while ( rs.next() ) {
                int id = rs.getInt( "id" ) ;
                String name = rs.getString( "name" ) ;

                System.out.print( "ID: " + id );
                System.out.print( ",name: " + name ) ;
                System.out.println();
            }
        } catch ( SQLException e ) {
            e.printStackTrace();
        }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?