Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NullPointerException:null对象引用上的Connection.createStatement()_Java_Android_Mysql_Jdbc - Fatal编程技术网

Java NullPointerException:null对象引用上的Connection.createStatement()

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

我正在使用JDBC进行Android中的一个学校项目(我知道这不是一件好事,),我不明白为什么createStatement会返回null。我正在异步任务中执行jdbc代码:

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();
    }
}
}