我遇到了问题,似乎无法找到答案。我有两个名为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指出了这一行,但我不知道问题出在哪里,所以我希望你能帮助我并指出我正确的方向。
答案 0 :(得分:1)
您的问题可能是您正在使用AsyncTask
创建数据库连接,并且正在使用connect
方法返回它。可能当你正在进行return conexiune;
时,你的联系还没有准备就绪,因为它正在以不同的Thread
进行初始化。
一种可能的解决方案(有很多)可以使用OnPostExecute
(来自AsyncTask)告诉你的班级你已准备好使用你的数据库,并调用你可能想要的任何方法。
另一种可能性是使用new Connect().execute().get()
并在那里返回您的连接,但您需要更改AsyncTask
参数并且您的用户界面将被冻结。所以我认为第一个选择是最好的。
使用ProgressBar
让用户在连接完成时等待。
最后另一种可能性(如果您的连接初始化不会持续很多),可能只是将初始化代码放在UI线程中,但这取决于您。
希望它有所帮助。