2009-08-21 21 views
2

這是我的代碼 - 我只是檢查我的MySQL數據庫連接。
但首先我編譯併成功運行程序。但後來我評論了Class.forName這一行。
仍然當我編譯它運行成功,沒有任何錯誤。爲什麼?Java不給錯誤!

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(); 
     } 
    } 
} 
+0

可愛:答案是在問題中// TODO:處理異常 – Peter 2009-08-21 09:24:55

+0

FirstJdbc你的意思是..:)我有一個答案在下面。 :) – DragonBorn 2009-08-21 15:13:16

回答

7

的Java 1.6中嘗試

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

可以找到JDBC驅動程序,即使沒有使用Class.forName。

這裏是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驅動程序的程序將繼續工作而不進行修改。

+0

嘿彼得 - 請你指點那些詳細的文件,一直在尋找,但找不到任何東西 - 歡呼尼克。 – 2009-08-21 09:20:35

+0

您是否必須將JDBC驅動程序放在特殊文件夾中才能使用? – pjp 2009-08-21 09:20:56

+0

@pjp - 會想到你必須做一些事情,比如把驅動放在一個'特殊文件夾'中。否則,您將通過每個類檢查哪些實現java.sql.Driver。這是會吸。 – 2009-08-21 09:26:31

8

我拋出一個錯誤,沒關係。這只是

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

子句默默吞下你的例外。

catch子句

+0

或e.printStackTrace(); – pjp 2009-08-21 09:22:20

+0

同意 - 它運行時沒有(顯示)錯誤,但它不能成功運行(不打印最後兩行)。從來沒有(...)抓住'Exception'而不處理它;) – 2009-08-21 09:24:18

+0

嘗試處理異常,但它仍然運行成功 – RubyDubee 2009-08-21 09:27:52

0

嘗試{

 //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驅動程序管理器]未找到數據源名稱並且未指定默認驅動程序

0

沒有Class.forName(),JDBC-ODBC橋驅動程序未加載。通過JDBC規範,如果找不到驅動程序的URL,則getConnection()返回null,不會引發異常。所以這是預期的行爲。

+1

除非使用JDBC 4.0(Java 6),否則不需要使用Class.forName(...)加載驅動程序。請參閱java.sql.DriverManager的JavaDoc。 – Jesper 2009-08-21 10:23:16

+0

來自Sun的JDBC-ODBC驅動程序太舊了。它不知道新的技巧。 – 2009-08-21 11:01:40

+0

哦,是的,它的確如此。檢查jre/lib/resources.jar中的META-INF/services/ava.sql.Driver文件 - 它包含「sun.jdbc.odbc.JdbcOdbcDriver」,即來自Sun!的JDBC-ODBC驅動程序。所以它可以在Java 6上無* Class.forName()的情況下明確使用。 – 2009-08-21 18:09:33