【问题标题】:Can anyone explain the purpose of the try block in this java code? [duplicate]谁能解释这个java代码中try块的目的? [复制]
【发布时间】:2018-08-22 16:07:00
【问题描述】:
import java.io.*;
import java.sql.*;
public class jdbcdemo
{
    public static void main(String args[])throws IOException
    {
        Connection con=null;
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con=DriverManager.getConnection("jdbc:odbc:ebbill","","");
            System.out.println("ConnectionSuccesfull");
            Statement stat=con.createStatement();
            int result=stat.executeUpdate("Insert into tableone values(5,'siva',50,6000)");
            System.out.println("Record Inserted");
            stat.close();
            con.close();
        }
        catch(ClassNotFoundException e)
        {
            System.out.println("Exception:"+e.getMessage());
        }
        catch(SQLException e)
        {
            System.out.println("Exception:"+e.getMessage());
        }
    }
}

我不明白这个 try 块中发生了什么。请用通俗的话简单解释一下。

这条线Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 在最新的java 中不起作用。它仅适用于java 6 或以前的版本。

【问题讨论】:

  • 请参考this answer。关于 try 块目的的问题:对于第一个 catch,它是关于类未找到异常的 catch 问题。第二个catch 用于捕获您尝试运行的 sql 的问题。

标签: java jdbc odbc


【解决方案1】:

线

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

尝试从应用程序的类路径加载类sun.jdbc.odbc.JdbcOdbcDriver。 如果找不到该类,则抛出异常ClassNotFoundException。

从 java 8 开始,这个类 (sun.jdbc.odbc.JdbcOdbcDriver) 已根据 oracle documentation 删除:

JDBC-ODBC 桥的状态 JDBC-ODBC 桥 应被视为一种过渡解决方案; 它将在 JDK 8 中删除。此外,Oracle 不支持 JDBC-ODBC 桥。 Oracle 建议您使用数据库供应商提供的 JDBC 驱动程序,而不是使用 JDBC-ODBC 桥。

【讨论】:

    【解决方案2】:

    try 块的目的是处理容易出错的代码,即 try 块内的代码,往往会在运行时抛出异常。

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con=DriverManager.getConnection("jdbc:odbc:ebbill","","");
        Statement stat=con.createStatement();
    

    当某些事情不正确时,上面的代码可能会导致错误,并导致 JVM 终止(换句话说,应用程序会出现错误)。为了处理运行时引起的异常,我们在try块中包含了容易出错的代码,并在catch块中包含了一个补救措施来处理异常情况。

    您的代码尝试加载类 "sun.jdbc.odbc.JdbcOdbcDriver" 。如果找不到该类,则抛出 ClassNotFoundException 异常。

    【讨论】:

      【解决方案3】:

      简单来说,在 try 块中,代码尝试建立与数据库的连接。然后它会尝试在该数据库中的表中插入一条记录,然后再断开与数据库的连接。

      将它放在 try 块中并在下面有 catch 块,意味着如果您的代码在任何时候出现问题,则执行与发生的特定错误相关的相应 catch 块中的代码。

      在您的情况下,您有两个 catch 块,ClassNotFoundException 和 SQLException。

      通常,执行以下行时可能会发生 ClassNotFoundException:

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      con=DriverManager.getConnection("jdbc:odbc:ebbill","","");
      

      一个常见的原因可能是您的项目中没有安装 JDBC 驱动程序。

      执行以下行时可能会引发 SQLException:

      Statement stat=con.createStatement();
              int result=stat.executeUpdate("Insert into tableone values(5,'siva',50,6000)");
      

      这通常是因为尝试访问数据库或使用 SQL 查询时数据库端出现问题而发生的。

      可能会引发其他异常,但是这些异常会导致您的程序崩溃,错误日志记录的用处更少,并且没有处理错误的逻辑。您可以只捕获异常(这将捕获抛出的任何异常),但是在现实世界中,这可能被认为是不好的做法,因为您应该知道可能会抛出哪些类型的异常并适当地处理它们。

      在您的示例中,假设由于某种原因,我们知道在您的应用程序运行时偶尔会在边缘情况下抛出 SQL 异常。我们还假设编写代码以防止这种情况发生在编程上是不可行的,因此我们只想记录错误,向用户提供消息并继续正常的执行流程以运行程序。

      但是,如果抛出 ClassNotFoundException,假设我们不想继续正常运行应用程序(我们将无法继续)。因此,我们可能希望记录错误,并向用户输出一条消息,建议他们联系系统管理员。

      所以这里我们对两种不同类型的错误有两种不同的响应,因此需要两个 catch 块来捕获不同类型的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多