无法从 Java 连接到 MySQL:MySQL 驱动程序连接逻辑中的 NullPointerException

Can't connect to MySQL from Java: NullPointerException inside MySQL driver connection logic

提问人:J. Willus 提问时间:4/29/2018 最后编辑:Mark RotteveelJ. Willus 更新时间:11/17/2021 访问量:24112

问:

我正在尝试连接到我在 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.jarDriverManager.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
java mysql

评论

0赞 achAmháin 4/29/2018
您是使用 try with resources 还是以某种方式关闭连接,然后尝试再次调用?这就是我过去看到的导致此错误的原因。
2赞 TwiN 4/29/2018
疯狂的猜测,但可能是因为您没有在 jdbc url 中指定数据库的名称吗?
0赞 Kevin Anderson 4/29/2018
在尝试调用之前,您是否设置了变量和实际用户名和密码?userpasswordgetConnection
1赞 TwiN 4/29/2018
您没有使用最新版本的mysql jdbc驱动程序有什么原因吗?
1赞 J. Willus 4/29/2018
@TwiN我已经弄清楚了如何使用最新版本;IntelliJ 自动选择版本,然后我必须手动编辑才能使用最新版本。它现在可以毫无问题地运行!5.1.40

答:

5赞 jspcal 4/29/2018 #1

听起来像是潜在的版本不匹配或过时的客户端。当您在 IDE 外部运行它时,可能会拉入错误的版本。我会确保客户端使用的是最新版本或与服务器使用的版本相似。

评论

1赞 J. Willus 4/29/2018
我已经想通了。问题出在过时的.我在 Intellij 中工作,必须导航到并将版本号更改为mysql-connector-java-5.1.40.jarFile>Project Structure>Libraries>(The J Connector I was using)>Edit8.0.11
47赞 TwiN 4/29/2018 #2

这可能是因为您使用的是旧版本的 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.415.1.40

-2赞 Gani 4/25/2019 #3

如果您调用 IP 地址 127.0.0.1/localhost,那么您正在与 localhost 通信——原则上是与您自己的计算机通信。如果未配置 localhost ,也会出现此问题

对于 Linux 系统

  • 如果缺少“127.0.0.1 localhost”,请在 /etc/hosts 下添加/编辑它。

对于Windows系统

  • 如果缺少,请在 C:windows/system32/drivers/etc/hosts 下添加/编辑。

有关 localhost 的更多详细信息

0赞 Dylan 10/28/2021 #4

我导入了错误版本的 mysql-connector。更改了以下内容

@Grab('mysql:mysql-connector-java:5.1.25')

@Grab('mysql:mysql-connector-java:5.1.46')

一切都按预期进行。

0赞 user1885498 11/17/2021 #5

我已经尝试了上述方法,但它不起作用。然后我检查了我的 .m2 文件夹,我注意到有一个版本 5.1.32 和版本 8.0.19 mysql 连接器。但是,当我尝试删除文件夹时,我无法在应用程序运行时删除版本 5.1.32。显然,这意味着版本 5 正在以某种方式使用,即使在 pom 中我已指定使用版本 8.0.19。

所以我只需要从 IntelliJ 失效并重新启动,瞧。