提问人:J. Willus 提问时间:4/29/2018 最后编辑:Mark RotteveelJ. Willus 更新时间:11/17/2021 访问量:24112
无法从 Java 连接到 MySQL:MySQL 驱动程序连接逻辑中的 NullPointerException
Can't connect to MySQL from Java: NullPointerException inside MySQL driver connection logic
问:
我正在尝试连接到我在 Java 程序中使用 MySQL 创建的数据库,但它总是失败。
为了举例,这是我的代码:
import java.sql.*;
public class Squirrel {
public static void main(String[] args) {
String user;
String password;
Connection connection;
Statement statement;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306", user, password);
statement = connection.createStatement();
// Other code
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
我能够从 IntelliJ 中连接到数据库,并将添加的内容添加到项目中,但每次运行程序时都会抛出以下内容:mysql-connector-java-5.1.40.jar
DriverManager.getConnection()
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2330)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:678)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
at Squirrel.main(Squirrel.java:12)
Caused by: java.lang.NullPointerException
at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:2997)
at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1934)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1863)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
... 13 more
答:
听起来像是潜在的版本不匹配或过时的客户端。当您在 IDE 外部运行它时,可能会拉入错误的版本。我会确保客户端使用的是最新版本或与服务器使用的版本相似。
评论
mysql-connector-java-5.1.40.jar
File>Project Structure>Libraries>(The J Connector I was using)>Edit
8.0.11
这可能是因为您使用的是旧版本的 MySQL 驱动程序。 您应该尝试使用最新版本。
要获取最新版本,您可以查看 https://mvnrepository.com/artifact/mysql/mysql-connector-java
截至目前,最新版本为 8.0.11。您可以在此处下载它或将其添加到您的:pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
更新
经过进一步调查,这似乎是因为以下方面引入了更改:MySQL 8.0.1
您报告的问题与 MySQL 中引入的更改有关 8.0.1 WRT 字符集和排序规则支持,现在添加了默认字符集“utf8mb4”。这样的变化打破了 Connector/J 初始化连接的方式。
如您所知,此问题已在 Connector/J 5.1.41 中修复,我相信您已经 已更新您的库。
如上所述,解决问题的另一种方法是使用 代替 .5.1.41
5.1.40
如果您调用 IP 地址 127.0.0.1/localhost,那么您正在与 localhost 通信——原则上是与您自己的计算机通信。如果未配置 localhost ,也会出现此问题
对于 Linux 系统
- 如果缺少“127.0.0.1 localhost”,请在 /etc/hosts 下添加/编辑它。
对于Windows系统
- 如果缺少,请在 C:windows/system32/drivers/etc/hosts 下添加/编辑。
我导入了错误版本的 mysql-connector。更改了以下内容
@Grab('mysql:mysql-connector-java:5.1.25')
自
@Grab('mysql:mysql-connector-java:5.1.46')
一切都按预期进行。
我已经尝试了上述方法,但它不起作用。然后我检查了我的 .m2 文件夹,我注意到有一个版本 5.1.32 和版本 8.0.19 mysql 连接器。但是,当我尝试删除文件夹时,我无法在应用程序运行时删除版本 5.1.32。显然,这意味着版本 5 正在以某种方式使用,即使在 pom 中我已指定使用版本 8.0.19。
所以我只需要从 IntelliJ 失效并重新启动,瞧。
评论
user
password
getConnection
5.1.40