Java 恼人的JDBC-MySQL错误“;CreateStation调用中出现致命异常";,如何解决这个问题?

Java 恼人的JDBC-MySQL错误“;CreateStation调用中出现致命异常";,如何解决这个问题?,java,android,mysql,jdbc,import,Java,Android,Mysql,Jdbc,Import,当我运行emulator时,它工作得非常好,没有错误,但是当我按下登录按钮时,我得到错误“java.lang.NullPointerException:尝试调用接口方法” 这是我的代码: public class MainActivity extends ActionBarActivity { Button add; TextView errorlbl; EditText name, address, pincode; Connection connect;

当我运行emulator时,它工作得非常好,没有错误,但是当我按下登录按钮时,我得到错误“java.lang.NullPointerException:尝试调用接口方法”

这是我的代码:

public class MainActivity extends ActionBarActivity {

    Button add;
    TextView errorlbl;
    EditText name, address, pincode;
    Connection connect;
    PreparedStatement preparedStatement;
    Statement st;
    String ipaddress, db, username, password;

    @SuppressLint("NewApi")
    private Connection ConnectionHelper(String user, String password,
                                        String database, String server) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection connection = null;
        String ConnectionURL = null;
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            ConnectionURL = "jdbc:jtds:sqlserver://" + server + ";"
                    + "databaseName=" + database + ";user=" + user
                    + ";password=" + password + ";";
            connection = DriverManager.getConnection(ConnectionURL);
        } catch (SQLException se) {
            Log.e("ERRO", se.getMessage());
        } catch (ClassNotFoundException e) {
            Log.e("ERRO", e.getMessage());
        } catch (Exception e) {
            Log.e("ERRO", e.getMessage());
        }
        return connection;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        add = (Button) findViewById(R.id.btnadd);

        errorlbl = (TextView) findViewById(R.id.lblerror);

        name = (EditText) findViewById(R.id.txtname);
        address = (EditText) findViewById(R.id.txtaddress);
        pincode = (EditText) findViewById(R.id.txtpincode);

        ipaddress = "92.244.93.250:3306";
        db = "lokal";
        username = "lokal";
        password = "12lokal34";
        connect = ConnectionHelper(username, password, db, ipaddress);
        add.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    st = connect.createStatement();

                    preparedStatement = connect
                            .prepareStatement("insert into studentRecord(Name,Address,Pincode) values ('"
                                    + name.getText().toString()
                                    + "','"
                                    + address.getText().toString()
                                    + "','"
                                    + pincode.getText().toString() + "')");
                    preparedStatement.executeUpdate();
                    errorlbl.setText("Data Added successfully");
                } catch (SQLException e) {
                    errorlbl.setText(e.getMessage().toString());
                }

            }
        });

    }
}
Logcat错误显示:

2182-2182/app.mysqlapp E/AndroidRuntime﹕ 致命异常:主 进程:app.mysqlapp,PID:2182 java.lang.NullPointerException:尝试对空对象引用调用接口方法“java.sql.Statement java.sql.Connection.createStatement()”


当出现问题时,您的
ConnectionHelper
方法会捕获异常并返回
null
。因此,在调用它时,由于您选择了不进行结构化异常处理,因此必须允许
null
返回值。您没有这样做,只是使用了
ConnectionHelper
的返回值,而没有首先检查它是否为
null

显然,
ConnectionHelper
中发生了错误,您正在捕获该错误并将其转储到日志中。这样就能告诉你出了什么问题


旁注:Java中压倒性的惯例是将方法的第一个字母大写


旁注2:允许
ConnectionHelper
中的异常传播到顶级入口点并在那里处理,这将是一种更好的做法。

很明显,您的连接对象为null,这意味着ConnectionHelper()返回null。。这进一步意味着下一行返回null

connection = DriverManager.getConnection(ConnectionURL);
现在,只有当驱动程序名称错误或ConnectionURL错误时,才会发生这种情况。由于驱动程序名称似乎正确,唯一的错误是您的连接url字符串。我只是在某时检查了这个类似的答案

在我看来,连接URl字符串应该是

 ConnectionURL = "jdbc:jtds:sqlserver://" + server + ";"
                    + "database=" + database + ";user=" + user
                    + ";password=" + password + ";";
注意连接字符串中的
数据库
数据库名
变量之间的差异。这应该行得通


更新在@T.J.Crowder的回答中提到的所有要点都是正确的,你应该养成遵循标准惯例的习惯。

从你的代码中可以清楚地看出,你的连接助手返回空值时出现了一些错误

注意:这只是我的猜测


您使用了net.sourceforge.jtds.jdbc.Driver,这是MsSql服务器的驱动程序,并且您将3306作为db服务器的端口,大部分3306用于MySql,因此您确定您已经在3306上配置了MsSql吗

您有完整的堆栈跟踪吗?连接对象似乎为空。
ConnectionHelper
调用是否有错误?您的
ConnectionHelper
似乎正在返回
null
。您是否记录了任何错误?最简单的修复方法是:不要在android平台上使用JDBC,但如果我想创建一个android应用程序,哪个登录表单将连接到MYSQL数据库呢?这就是问题所在,谢谢你,伙计!:)@二子,这是我的荣幸