java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Conn

问题描述

出现这个问题是我在连接数据使用语句查询的时候报的错误,当时反反复复检查线程里的数据库查询代码,一时没有发现问题。报的错误就是标题所述。
在这里插入图片描述
具体代码,当时也是立马到了85行代码这里(当然从代码的错误说明上也感觉是conn是空,后面有测试了一下,发现果然是这样。

package com.example.mysqlconnectiontest;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button button,button_delete,button_insert,button_update;
    private TextView textView;
    private static final int TEST_USER_SELECT = 1;
    int i =0,d=0,z=0;
    private EditText editText,editText_update;
    private final  static int SEARCH_MOHU =1;
    String url,user_phonenumber;
    private List<NewsBean.ResultBean.DataBean> list;
    @SuppressLint("HandlerLeak")
    private Handler searchHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case SEARCH_MOHU:
                    list = ((NewsBean) msg.obj).getResult().getData();
                    System.out.println("*&*&*&*&*&*&*&*&");
                    System.out.println(list.size());
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.bt_send);
        textView = (TextView) findViewById(R.id.tv_response);
        button_delete = (Button) findViewById(R.id.bt_delete);
        button_insert = (Button) findViewById(R.id.bt_insert);
        button_update = (Button) findViewById(R.id.bt_update);
        editText_update = (EditText) findViewById(R.id.ed_update);
    }
    @Override
    protected void onStart() {
        super.onStart();
        button.setOnClickListener(this);
        button_delete.setOnClickListener(this);
        button_insert.setOnClickListener(this);
        button_update.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt_send:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                       NewsBean newsBean = new NewsBean();
                        List<NewsBean.ResultBean.DataBean> dataBeanList = new ArrayList<>();
                        Connection conn = null;
                        conn =(Connection) DBOpenHelper.getConn();
                        String sql ="select title from news_info where  match(title,category) AGAINST ('体育' IN BOOLEAN MODE )";
                        Statement st;
                        try {
                            st = (Statement) conn.createStatement();
                            ResultSet rs = st.executeQuery(sql);
                            while (rs.next()){
                                NewsBean.ResultBean.DataBean dataBean = new NewsBean.ResultBean.DataBean();
                                //下一行就是报错的位置
                                //
                                dataBean.setTitle(rs.getString(1));
                                //
                                dataBeanList.add(dataBean);
                            }
                            newsBean.setResult(new NewsBean.ResultBean());
                            newsBean.getResult().setData(dataBeanList);
                            st.close();
                            conn.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                        Message msg = searchHandler.obtainMessage();
                        msg.what = SEARCH_MOHU;
                        msg.obj = newsBean;
                        searchHandler.sendMessage(msg);
                    }
                }).start();
                break;
                default:
        }
    }
}

解决思路

既然他到这里就崩掉了,而且说是空对象,那我在上面弄一个判断来看一下是不是真的是这样。
修改部分代码(因为篇幅过长,就贴出改动的那部分了)

 Connection conn = null;
                        conn =(Connection) DBOpenHelper.getConn();
                        if (conn ==null){
                            System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
                            System.out.println(""+conn);
                        }
                        String sql ="select title from news_info where  match(title,category) AGAINST ('体育' IN BOOLEAN MODE )";
                        Statement st;

控制台信息:
java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Conn_第1张图片
我在获取连接之后就判断conn是否为空如果为空的话,则说明是DBOPenHelper.getConn()方法里有错误。
java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Conn_第2张图片
点击蓝色的错误信息上的,DBOpenHelper.java: 20行,发现是conn出错,然后这个方法参数有三个url,user,password,最后发现是url出了错误,数据库test不存在,所以conn连接也不存在,到这里问题解决。
如果找到这里还是没有发现问题的话,检查一下驱动版本和数据库版本是不是大版本不一致。
欢迎一起讨论哦!

你可能感兴趣的:(Android与数据库,常见问题专区,mysql,自我检查)