Java ClassNotFoundException与DriverManager.getConnection一起引发?

Java ClassNotFoundException与DriverManager.getConnection一起引发?,java,jdbc,classnotfoundexception,Java,Jdbc,Classnotfoundexception,想知道在以下场景中是否可能抛出ClassNotFoundException: DriverManager.getConnection(...); 我知道手动加载驱动程序Class.forName(drivers..)时可能会抛出它。另一方面,从JDBC 4.0开始,不需要手动执行,因为类驱动程序管理器会自动执行此任务。 我的问题是:当自动加载驱动程序时,如果没有找到正确的驱动程序,它是否会抛出ClassNotFoundException?我在DriverManager的API中看到,它只抛出S

想知道在以下场景中是否可能抛出
ClassNotFoundException

DriverManager.getConnection(...);
我知道手动加载驱动程序
Class.forName(drivers..)
时可能会抛出它。另一方面,从JDBC 4.0开始,不需要手动执行,因为类驱动程序管理器会自动执行此任务。 我的问题是:当自动加载驱动程序时,如果没有找到正确的驱动程序,它是否会抛出
ClassNotFoundException
?我在DriverManager的API中看到,它只抛出SQLException,与ClassNotFoundException没有任何关系

这意味着它不会扔吗? 谢谢


确实是

不,它不能抛出
ClassNotFoundException
。对于JDBC4,如果驱动程序未注册,您将得到一个异常,表明该url不存在已注册的驱动程序。差不多

Exception in thread "main" java.sql.SQLException: No suitable driver found for <your url>
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at ru.expbrain.flib.Main.main(Main.java:15)
线程“main”java.sql.SQLException中的异常:找不到适合的驱动程序 位于java.sql.DriverManager.getConnection(未知源) 位于java.sql.DriverManager.getConnection(未知源) 位于ru.expbrain.flib.Main.Main(Main.java:15)
DriverManager.getConnection(字符串)
的javadoc声明

DriverManager尝试从中选择适当的驱动程序 一组注册的JDBC驱动程序


它是抛出
ClassNotFoundExceptionhttp
而不是DriverManager.getConnection(…)的Class.forName方法。见文件


另外,请确保您提供了完全限定的类名作为class。forName()需要一个完全限定的类名

它会引发SQLException,类似于
java.sql.SQLException:找不到适合jdbc的驱动程序:mysql://localhost:3306/test
。它在DriverManager.getConnection API中声明

Throws: SQLException - if a database access error occurs

您知道,您可以查看
DriverManager
的源代码,查看它如何从类路径加载
Driver
实现(源代码包含在JDK中)

或者您可以查看:

  • (创建连接)
  • (从类路径中的
    META-INF/services/java.sql.Driver
    文件加载驱动程序)
loadInitialDrivers
将忽略迭代
ServiceLoader
迭代器返回的类时引发的任何异常

另外,由于
ClassNotFoundException
是一个选中的异常,并且
getConnection()
没有声明抛出该异常,因此您应该知道它永远无法抛出该异常(除非包装在不同的异常中)