空连接变量

时间:2014-11-10 07:55:00

标签: java android nullpointerexception database-connection prepared-statement

我遇到了问题,似乎无法找到答案。我有两个名为Harta.java和DBOperations.java的类。在Harta.java中,我从数据库获取坐标,以便在我启动应用程序时显示标记,在DBOperations中我将连接到数据库。

我将深入解释,这是我的Harta.class中的方法

DBOperations operations = new DBOperations();

...

public void markers() {

        double latitude, longitude;

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);

        String sql = "SELECT id, ST_X(geom), ST_Y(geom) FROM modul";

        PreparedStatement prepst;
        try {
            prepst = operations.conexiune.prepareStatement(sql);
            ResultSet rs = prepst.executeQuery();
            while (rs.next()) {
                int id = rs.getInt("id");
                longitude = rs.getDouble("ST_X(geom)");
                latitude = rs.getDouble("ST_Y(geom)");

                LatLng latlng = new LatLng(latitude, longitude);

                map.addMarker(new MarkerOptions().position(latlng).title(
                        "Marker " + id));
            }
        } catch (Exception e) {
            Log.e(Harta.class.getName(), "query failed to execute: " + e);
            e.printStackTrace();
        }
    }

此行发生NullPointerException:

prepst = operations.conexiune.prepareStatement(sql);

显然这个operations.conexiune(DBOperations operations = new DBOperations)是null,但我不明白为什么。我的DBOperations.java中有几种方法,但我只会告诉你两件事。我调用的connect()方法打开与数据库的连接:

private String DB_URL = "...";
private String DB_USER = "...";
private String DB_PW = "...";
public Connection conexiune;

...

public Connection connect() {
        try {
            new Connect().execute();
            Log.d(DBOperations.class.getName(),
                    "Se incearca deschiderea conexiunii.");
        } catch (Exception e) {
            Log.d(DBOperations.class.getName(),
                    "Incercarea de a deschide conexiunea a esuat.");
        }
        return conexiune;
    }

我的Asynctask类用于连接数据库。 (PS:我在主活动的OnCreate方法中连接(成功)到数据库。)

class Connect extends AsyncTask<Void, Void, Void> {

        protected Void doInBackground(Void... params) {
            try {
                Class.forName("org.postgresql.Driver");
                Log.e(DBOperations.class.getName(),
                        "Database driver is working fine.");
            } catch (Exception e1) {
                Log.e(DBOperations.class.getName(),
                        "Database driver is broken: " + e1);
            }

            try {
                conexiune = DriverManager.getConnection(DB_URL, DB_USER, DB_PW);
                Log.e(DBOperations.class.getName(),
                        "Succesfully connected to the database.");
            } catch (Exception e2) {
                Log.e(DBOperations.class.getName(),
                        "Database connection error: " + e2);
            }
            return null;
        }
    }

正如我之前所说,nullpointerexception指出了这一行,但我不知道问题出在哪里,所以我希望你能帮助我并指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

您的问题可能是您正在使用AsyncTask创建数据库连接,并且正在使用connect方法返回它。可能当你正在进行return conexiune;时,你的联系还没有准备就绪,因为它正在以不同的Thread进行初始化。

一种可能的解决方案(有很多)可以使用OnPostExecute(来自AsyncTask)告诉你的班级你已准备好使用你的数据库,并调用你可能想要的任何方法。

另一种可能性是使用new Connect().execute().get()并在那里返回您的连接,但您需要更改AsyncTask参数并且您的用户界面将被冻结。所以我认为第一个选择是最好的。

使用ProgressBar让用户在连接完成时等待。

最后另一种可能性(如果您的连接初始化不会持续很多),可能只是将初始化代码放在UI线程中,但这取决于您。

希望它有所帮助。