Java NullPointerException:null对象引用上的Connection.createStatement()
我正在使用JDBC进行Android中的一个学校项目(我知道这不是一件好事,),我不明白为什么createStatement会返回null。我正在异步任务中执行jdbc代码:Java NullPointerException:null对象引用上的Connection.createStatement(),java,android,mysql,jdbc,Java,Android,Mysql,Jdbc,我正在使用JDBC进行Android中的一个学校项目(我知道这不是一件好事,),我不明白为什么createStatement会返回null。我正在异步任务中执行jdbc代码: private class Inserisci extends AsyncTask<Void, Void, ResultSet> { @Override protected ResultSet doInBackground(Void... params) { String c
private class Inserisci extends AsyncTask<Void, Void, ResultSet> {
@Override
protected ResultSet doInBackground(Void... params) {
String comando = "SELECT nome FROM prodotti";
Connection c = null;
try {
c = DriverManager.getConnection("jdbc:mysql://192.168.137.1:3306/eshop", "root", "");
} catch (SQLException e) {
e.printStackTrace();
}
Statement s = null;
try {
s = c.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
comando = "SELECT nome FROM prodotti";
try {
return s.executeQuery(comando);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(ResultSet resultSet) {
try {
showMessage(resultSet.getString(1));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
将代码包装在同一try-catch子句中,看起来您无法创建连接 试试这个:
private class Inserisci extends AsyncTask<Void, Void, ResultSet> {
@Override
protected ResultSet doInBackground(Void... params) {
String comando = "SELECT nome FROM prodotti";
Connection c = null;
try {
c = DriverManager.getConnection("jdbc:mysql://192.168.137.1:3306/eshop", "root", "");
Statement s = null;
s = c.createStatement();
comando = "SELECT nome FROM prodotti";
return s.executeQuery(comando);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(ResultSet resultSet) {
try {
showMessage(resultSet.getString(1));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
私有类Inserisci扩展异步任务{
@凌驾
受保护的结果集doInBackground(无效…参数){
字符串comando=“从prodotti中选择nome”;
连接c=null;
试一试{
c=DriverManager.getConnection(“jdbc:mysql://192.168.137.1:3306/eshop“,”根“,”);
语句s=null;
s=c.createStatement();
comando=“从prodotti中选择nome”;
返回s.executeQuery(comando);
}捕获(SQLE异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(ResultSet ResultSet){
试一试{
showMessage(resultSet.getString(1));
}捕获(SQLE异常){
e、 printStackTrace();
}
}
}
无法真正了解原因,但现在nullpointer异常出现在ResultSet上:java.lang.NullPointerException:尝试在com.quintabi.facchini.foobarmanager.MainActivity$Inserisci.onPostExecute(MainActivity.java:136)上的空对象引用上调用接口方法“java.lang.String java.sql.ResultSet.getString(int)”似乎它无法获取数据。。。谢谢,这是因为你的结果集是空的,也许是因为你的查询也是空的。尝试调试代码中的值,在尝试调用方法“createStatement()”时检查“c”值,在尝试调用“executeQuery(查询)”方法时检查“s”值。这就是为什么应该将所有代码放在同一个Try块中,这样,您将确保代码可以在没有任何异常的情况下执行。不推荐使用。这里有泄漏的语句
,更糟糕的是,还有泄漏的连接
。您确实无法编写返回ReaultSet
的方法。你需要重构你的代码。我不这么认为
private class Inserisci extends AsyncTask<Void, Void, ResultSet> {
@Override
protected ResultSet doInBackground(Void... params) {
String comando = "SELECT nome FROM prodotti";
Connection c = null;
try {
c = DriverManager.getConnection("jdbc:mysql://192.168.137.1:3306/eshop", "root", "");
Statement s = null;
s = c.createStatement();
comando = "SELECT nome FROM prodotti";
return s.executeQuery(comando);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(ResultSet resultSet) {
try {
showMessage(resultSet.getString(1));
} catch (SQLException e) {
e.printStackTrace();
}
}
}