来自 DAO 方法的 return 值的空指针异常
Nullpointer Exception on return value from a DAO method
我使用的是 Room 数据库,我希望在输入对象名称时从数据库中搜索并获取单个对象。为此,我在 DAO 中编写了这个查询:
@Query("SELECT * FROM kuh_table WHERE name = :kuhName ")
Kuh findKuh(String kuhName);
我在存储库中这样调用它:
public Kuh findKuh(String kuhName){
final Kuh[] kuh = new Kuh[1];
new Thread(new Runnable() {
volatile boolean running = true;
@Override
public void run() {
if(running!= true) {
return;
}
kuh[0] =kuhDAO.findKuh(kuhName);
running = false;
}
}).start();
return kuh[0];
}
然后在我的 ViewModel 中这样:
public Kuh findKuh(String kuhName){ return repository.findKuh(kuhName);}
然后我在一个片段中初始化我的 ViewModel 并尝试通过给出这样的字符串来使用该方法:
MarkerApiKt.setMarkerTapListener(mapView, (MarkerTapListener) (new MarkerTapListener() {
public void onMarkerTap(@NotNull View view, int x, int y) {
Intrinsics.checkNotNullParameter(view, "view");
if (view instanceof MapMarker) {
MarkerCallout callout = new MarkerCallout(context);
callout.setTitle(((MapMarker) view).getName());
callout.setSubTitle("position: " + ((MapMarker) view).getX() + " , " + ((MapMarker) view).getY());
Kuh kuh = kuhViewModel.findKuh(((MapMarker) view).getName());
Toast.makeText(context, "this is "+ kuh.getName(), Toast.LENGTH_SHORT).show();
但不知何故,我的对象的距离总是空的,因为我最终遇到了一个空指针异常。
知道我可能做错了什么吗?
所以,正如@Olli 所说,问题是我的存储库中的线程没有完成执行,这就是它返回空对象的原因。
我只是这样更改了我的代码,现在可以正常工作了
public Kuh findKuh(String kuhName) throws InterruptedException {
final Kuh[] kuh = new Kuh[1];
Thread t1 = new Thread(new Runnable() {
volatile boolean running = true;
@Override
public void run() {
if(running!= true) {
return;
}
kuh[0] =kuhDAO.findKuh(kuhName);
running = false;
}
});
t1.start();
t1.join();
return kuh[0];
}
我使用的是 Room 数据库,我希望在输入对象名称时从数据库中搜索并获取单个对象。为此,我在 DAO 中编写了这个查询:
@Query("SELECT * FROM kuh_table WHERE name = :kuhName ")
Kuh findKuh(String kuhName);
我在存储库中这样调用它:
public Kuh findKuh(String kuhName){
final Kuh[] kuh = new Kuh[1];
new Thread(new Runnable() {
volatile boolean running = true;
@Override
public void run() {
if(running!= true) {
return;
}
kuh[0] =kuhDAO.findKuh(kuhName);
running = false;
}
}).start();
return kuh[0];
}
然后在我的 ViewModel 中这样:
public Kuh findKuh(String kuhName){ return repository.findKuh(kuhName);}
然后我在一个片段中初始化我的 ViewModel 并尝试通过给出这样的字符串来使用该方法:
MarkerApiKt.setMarkerTapListener(mapView, (MarkerTapListener) (new MarkerTapListener() {
public void onMarkerTap(@NotNull View view, int x, int y) {
Intrinsics.checkNotNullParameter(view, "view");
if (view instanceof MapMarker) {
MarkerCallout callout = new MarkerCallout(context);
callout.setTitle(((MapMarker) view).getName());
callout.setSubTitle("position: " + ((MapMarker) view).getX() + " , " + ((MapMarker) view).getY());
Kuh kuh = kuhViewModel.findKuh(((MapMarker) view).getName());
Toast.makeText(context, "this is "+ kuh.getName(), Toast.LENGTH_SHORT).show();
但不知何故,我的对象的距离总是空的,因为我最终遇到了一个空指针异常。 知道我可能做错了什么吗?
所以,正如@Olli 所说,问题是我的存储库中的线程没有完成执行,这就是它返回空对象的原因。
我只是这样更改了我的代码,现在可以正常工作了
public Kuh findKuh(String kuhName) throws InterruptedException {
final Kuh[] kuh = new Kuh[1];
Thread t1 = new Thread(new Runnable() {
volatile boolean running = true;
@Override
public void run() {
if(running!= true) {
return;
}
kuh[0] =kuhDAO.findKuh(kuhName);
running = false;
}
});
t1.start();
t1.join();
return kuh[0];
}