Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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/184.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 空连接变量_Java_Android_Nullpointerexception_Database Connection_Prepared Statement - Fatal编程技术网

Java 空连接变量

Java 空连接变量,java,android,nullpointerexception,database-connection,prepared-statement,Java,Android,Nullpointerexception,Database Connection,Prepared Statement,我有个问题,似乎找不到答案。我有两个类叫做Harta.java和DBOperations.java。在Harta.java中,我从数据库获取坐标,以便在启动应用程序时显示标记,在DBOperations中,我连接到数据库 我将详细解释,这是我的Harta类中的方法 DBOperations operations = new DBOperations(); ... public void markers() { double latitude, longitude;

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

我将详细解释,这是我的Harta类中的方法

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=newdboperations)是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类。(注:我正在用我的主要活动的OnCreate方法连接(成功地)到数据库。)

类连接扩展异步任务{
受保护的Void doInBackground(Void…参数){
试一试{
Class.forName(“org.postgresql.Driver”);
Log.e(DBOperations.class.getName(),
“数据库驱动程序工作正常。”);
}捕获(异常e1){
Log.e(DBOperations.class.getName(),
“数据库驱动程序已损坏:”+e1);
}
试一试{
conexiune=DriverManager.getConnection(DB_URL、DB_USER、DB_PW);
Log.e(DBOperations.class.getName(),
“成功连接到数据库。”);
}捕获(异常e2){
Log.e(DBOperations.class.getName(),
“数据库连接错误:”+e2);
}
返回null;
}
}

如前所述,nullpointerexception指向该行,但我不知道问题在哪里,因此我希望您能帮助我指出问题所在,并为我指出正确的方向。

您的问题可能是您正在使用
AsyncTask
创建DB连接,并在
connect
方法中返回它。可能是在执行
返回conexiune时您的连接尚未就绪,因为它正在另一个
线程中初始化

一种可能的解决方案(有很多)是使用
OnPostExecute
(来自AsyncTask)告诉类您已经准备好使用DB,并调用您可能需要的任何方法

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

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

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


希望有帮助。

您显示了您的
公共连接connect()
代码,但我看不到它在任何地方被调用。如果对
operations.conexiune.prepareStatement(sql)
的调用抛出了NPE,那么
operations
conexiune
都是
null
。您应该告诉我们,这些变量(或字段)是在哪里声明和初始化的。@ScaryWombat:您错过了这一行:(PS:我正在用我的主活动的OnCreate方法连接(成功地)到数据库。)@Seelenvirtuose:DBOperations=new DBOperations();作为我的Harta.java中的“全局”变量。公共关系委员会;在我的DBOperations.java中,我欠你的债,亲爱的先生。我没有想出你的第一个解决方案,但你的第二个解决方案确实有效。非常感谢你。
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;
        }
    }