【问题标题】:Null Pointer Exception in JDBCJDBC 中的空指针异常
【发布时间】:2014-08-12 08:52:33
【问题描述】:

我正在尝试执行一个 Java 文件,但是当我执行此操作时,我在程序的这一部分收到错误 NullPointerException

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.SQLException;

public class HiveClient {
   // JDBC driver required for Hive connections
   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
   private static Connection con;

   private static Connection getConnection(String ip, String port, String user, String password) {
      try {
         // dynamically load the Hive JDBC driver
         Class.forName(driverName);
      } catch (ClassNotFoundException e) {
         System.out.println(e.getMessage());
         return null;
      } // try catch

      try {
         // return a connection based on the Hive JDBC driver
         return DriverManager.getConnection("jdbc:hive://" + ip + ":" + port + "/default?user=" + user + "&password=" + password);

      } catch (SQLException e) {
         System.out.println(e.getMessage());
         return null;
      } // try catch
   } // getConnection

   public static void main(String[] args) {
      try {
         // from here on, everything is SQL!
         con = getConnection("130.206.80.46", "10000", "myuser", "mypasswd");
         Statement stmt = con.createStatement();
         ResultSet res = stmt.executeQuery("select column1,column2,otherColumns " + "from mytable where column1='whatever' and columns2 like '%whatever%'");

         // iterate on the result
         while (res.next()) {
            String column1 = res.getString(1);
            Integer column2 = res.getInt(2);

            // whatever you want to do with this row, here
         } // while

         // close everything
         res.close();
         stmt.close();
         con.close();

      } catch (SQLException ex) {
         System.exit(0);
      } // try catch
   }
    // doQuery
} // HiveClient

这是消息:

Exception in thread "main" java.lang.NullPointerException
    at HiveClient.main(HiveClient.java:34)
Java Result: 1

异常所在的行:

Statement stmt = con.createStatement();

我检查了java.sql.Connection 包,并且方法摘要中允许使用createStatement()

【问题讨论】:

  • 发布您的堆栈跟踪并添加其他相关代码
  • getConnection 方法是什么?处理 NPE 必须做的第一件事是跟踪 null 变量的来源。
  • 显示您的 getConnection 方法。
  • 你可能没有连接,或者驱动有问题,购买你提供的信息量不足。给我们异常消息广告堆栈跟踪。搭配:try{ con = getConnection("130.206.80.46", "10000", "myuser", "mypasswd");语句 stmt = con.createStatement(); } 捕捉(异常 e){ e.printStackTrace(); }
  • 我已经编辑了我的帖子,感谢您的回复。

标签: java jdbc


【解决方案1】:

让我们对问题应用一些逻辑

问:为什么该语句会抛出 NPE?

答:唯一可能的解释是con 的值是null

问:为什么con 的值是null

A:唯一的解释是这个语句是把null赋值给con

        con = getConnection("130.206.80.46", "10000", "myuser", "mypasswd");

这意味着getConnection 返回null

问:为什么getConnection 返回null

A:查看该方法的代码。它有两个地方显式返回null。首先是Class.forName(driverName) 抛出ClassNotFoundException。其次是DriverManager.getConnection(...) 抛出SQLException。在所有其他情况下,它将返回一个非空值。 (阅读 javadocs ...)

问:那是什么?

A:看代码!请注意,在返回null 的两个地方,您都向标准输出写入了一条消息。该消息将回答您的问题!


您在这里遇到麻烦的原因是您过早地捕获异常,并返回null 作为“补救措施”。正是 null 导致了最终问题。

实现这一点的正确方法是将getConnection 的声明更改为抛出ClassNotFoundExceptionSQLException。然后在getConnection 中删除这些异常的处理程序,并改为在main 中处理它们。当您处理它们时,请确保输出(或记录)堆栈跟踪...以便更轻松地诊断问题的真正原因。


(致其他一些答案的作者:调试不应该是猜测问题所在。您应该查看证据,并得出逻辑 从该证据中得出结论。当证据指向多种可能的原因时,请考虑所有原因。猜测充其量只是一条捷径。最坏的情况是,它会让你浪费大量时间去追求“理论” 不可能是真的。)

【讨论】:

  • 非常好的解决问题的建议(证据-逻辑结论-多种​​原因)。谢谢!
  • 多么美妙的解释!非常感谢@Stephen!
【解决方案2】:

首先检查您的驱动程序是否已成功加载和注册,还要检查驱动程序是否在您的类路径中。 在使用 Connection 等引用之前,养成检查空值的习惯。

【讨论】:

  • 嗨!在我的类路径中?我导入了包,我也要下载吗?
  • XXXdriver.jar 的位置应该存在于您的类路径中。如果您可以导入它,则意味着您已经在本地拥有它。
  • 由于您的驱动程序类没有获得 ClassNotFoundException,这意味着您的驱动程序在您的类路径中。尝试调试并查看是否从 DriverManager.getConnection(...) 获得连接参考
  • 你是对的,问题出在驱动程序上,因为它没有去第一次尝试,而是运行catch
【解决方案3】:

您的getConnection() 方法不应该打印出异常然后返回null。如果找不到驱动程序或(由于某种原因)成功加载,它应该简单地抛出一个异常。如果getConnection() 的结果是null,您的代码根本不会检查,这将导致NullPointerException。什么是有意义的检查,看看你的类路径上是否有相应的 JDBC 驱动程序。

【讨论】:

    【解决方案4】:

    尝试使用此摇摆方式建立连接

     DriverManager.getConnection("jdbc:hive://" + ip + ":" + port+ "/default", user, password);
    

    【讨论】:

    • 您能解释一下 OP 的代码有什么问题吗?为什么这样可以解决问题?
    【解决方案5】:

    只是指出对我有帮助的地方。 我在我的活动的 onCreate 方法中添加了额外的许可:

    if (Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new      StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    

    【讨论】:

      【解决方案6】:

      转到数据库并确保 SQL 查询的第一列不为空。我有同样的问题,因为我的第一列 SQLquery 在 DB 中为空。因此这些异常可能会发生,即您的 SQLquery 中的第一列在 DB 中为空,并且不要尝试在 SQLquery 中添加 DB 的空列。我希望这可能对你有所帮助。

      帕布医学博士

      【讨论】:

        【解决方案7】:

        尝试类似:

        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql:// localhost:PORT/DBName", "mysql", "mysql");
        

        【讨论】:

        • 他没有使用mysql。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 2014-08-04
        相关资源
        最近更新 更多