【问题标题】:Java not giving Error!Java没有给出错误!
【发布时间】:2010-11-21 14:29:23
【问题描述】:

这是我的代码 - 我只是检查我的 MySQL 数据库连接。
但首先我已经成功编译并运行了程序。但后来我评论了 Class.forName 行。
还是当我编译它运行成功,没有任何错误。为什么?

import java.sql.Connection;
import java.sql.DriverManager;


public class FirstJbdc {
    public static void main(String[] args) {
        Connection cn=null;
        try {
            //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            System.out.println("Driver loaded successfully");
            cn=DriverManager.getConnection("jdbc:odbc:myDSN","root", "java");
            System.out.println("Database connected successfully....");
            System.out.println(cn);
        } catch (Exception e) {
            // TODO: handle exception
                        e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 可爱:答案在问题中 // TODO: 处理异常
  • FirstJdbc 你的意思是.. :) 我在下面有一个答案。 :)

标签: java mysql database jdbc odbc


【解决方案1】:

我抛出一个错误,好吧。只是这个

catch (Exception e){
     // here the exception is instantiated, but nothing is done about it
}

子句默默地吞下你的例外。

试一试

System.out.println( e.getMessage() );

在 catch 子句中

【讨论】:

  • 同意 - 它运行时没有(显示)错误,但没有成功运行(不打印最后两行)。永远不要(...)在不处理的情况下捕获“异常”;)
  • @peter - 你能提供任何与此相关的链接吗!
  • @Pradyumna Dandwate:也许您可以使用更新的代码编辑问题。不确定您所说的“尝试处理异常”是什么意思。
  • 我用相关信息和权威文档链接更新了我的答案。
【解决方案2】:

Java 1.6 即使不使用 Class.forName 也可以找到 JDBC 驱动程序。

这是documentation的相关部分:

DriverManager 方法 getConnectiongetDrivers 已得到增强,以支持 Java 标准版服务提供者机制。 JDBC 4.0 驱动程序必须包含文件META-INF/services/java.sql.Driver。该文件包含java.sql.Driver 的JDBC 驱动程序实现的名称。例如,要加载 my.sql.Driver 类,META-INF/services/java.sql.Driver 文件将包含以下条目:

my.sql.Driver

应用程序不再需要使用 Class.forName() 显式加载 JDBC 驱动程序。当前使用 Class.forName() 加载 JDBC 驱动程序的现有程序无需修改即可继续工作。

【讨论】:

  • 嘿彼得 - 请你指出详细说明这一点的文档,一直在搜索但找不到任何东西 - 干杯尼克。
  • 您不需要将 JDBC 驱动程序放在一个特殊的文件夹中才能正常工作吗?
  • @pjp - 会认为你必须做一些事情,比如将驱动程序放在“特殊文件夹”中。否则,您将遍历每个类,检查哪些类实现了 java.sql.Driver。这会很糟糕。
  • @Nick:查看 Javadoc 以了解 JDK 1.6 中的 DriverManager,尤其是以“DriverManager 方法 getConnection 和 getDrivers 已得到增强以支持 Java Standard Edition Service Provider 机制”开头的部分。
  • @Peter:干杯,这是我今天学到的新知识清单上的一个勾号:-)
【解决方案3】:

注意:这仅适用于 JDBC 4.0 之前的驱动程序。

JDBC 驱动程序有一个static 部分,在加载类时将它们注册到java.sql.DriverManager,因此需要Class.forName(String)

这里有详细说明:http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/drivermanager.html

【讨论】:

    【解决方案4】:

    试试{

         //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
          System.out.println("Driver loaded successfully");
          cn=DriverManager.getConnection("jdbc:odbc:myDSN","root", "java");
          System.out.println("Database connected successfully....");
          System.out.println(cn);
    } catch (Exception e) {
        // add the following statement
        System.out.println(e.getMessage());
    }
    

    如果你在 catch 块中添加语句,然后编译并运行,你应该会看到类似的错误消息-

    [Some Com][Some Driver Manager] 未找到数据源名称且未指定默认驱动程序

    【讨论】:

      【解决方案5】:

      如果没有Class.forName(),则不会加载 JDBC-ODBC 桥驱动程序。根据 JDBC 规范,getConnection() 如果没有找到该 URL 的驱动程序,则返回 null,不会引发异常。所以这是预期的行为。

      【讨论】:

      • 除非您使用的是 JDBC 4.0 (Java 6),因为不再需要使用 Class.forName(...) 加载驱动程序。参见 java.sql.DriverManager 的 JavaDoc。
      • Sun 的 JDBC-ODBC 驱动程序太旧了。它不知道新花样。
      • 哦,是的,确实如此。查看 jre/lib/resources.jar 中的 META-INF/services/ava.sql.Driver 文件——它包含“sun.jdbc.odbc.JdbcOdbcDriver”,即来自 Sun 的 JDBC-ODBC 驱动程序!所以它绝对可以在 Java 6 上 without Class.forName() 使用。
      • 你是对的。我忘了我们使用的是自定义版本的驱动程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多