JDBC中的空指针异常

时间:2014-08-12 08:52:33

标签: java jdbc

我正在尝试执行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()

7 个答案:

答案 0 :(得分:2)

让我们将一些逻辑应用于问题。

问:为什么NPE被该声明抛出?

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

问:为什么con的值为null

答:唯一的解释是此声明将null分配给con

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

这意味着getConnection会返回null

问:为什么getConnection会返回null

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

问:那是什么?

答:看看代码!请注意,在返回null的两个位置,您都会向标准输出写入消息。该消息将回答您的问题!!


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

正确的实现此方法的方法是更改​​getConnection的声明,表明它会抛出ClassNotFoundExceptionSQLException。然后移除getConnection中针对这些例外的处理程序,并在main中处理它们。当您处理它们时,请确保输出(或记录)堆栈跟踪...以便更容易诊断问题的真正原因。


(对于其他一些答案的作者:调试不应该是猜测问题是什么。你应该查看证据,并绘制逻辑证据的结论。当证据指出多个可能的原因时,请全部考虑。猜测工作充其量只是一种捷径。最坏的情况是,它会浪费大量时间追求“理论” 不可能是真的。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

尝试使用此摇摆来获得连接

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

答案 4 :(得分:0)

只是指出对我有帮助的东西。 我添加了额外的permition来onCreate我的活动方法:

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

答案 5 :(得分:0)

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

Prabhu MD

答案 6 :(得分:-1)

尝试类似:

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