我正在尝试执行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()
。
答案 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
的声明,表明它会抛出ClassNotFoundException
和SQLException
。然后移除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");