Java 空连接变量
我有个问题,似乎找不到答案。我有两个类叫做Harta.java和DBOperations.java。在Harta.java中,我从数据库获取坐标,以便在启动应用程序时显示标记,在DBOperations中,我连接到数据库 我将详细解释,这是我的Harta类中的方法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;
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;
}
}