Исключение нулевого указателя при попытке получить все документы из базы данных CouchDB с помощью ektorp на Android

У меня есть простая модель предмета с именем и количеством:

public class Item  extends CouchDbDocument{
private static final long serialVersionUID = -3645214415410443346L;
private String name;
private int quantity;

public Item (String name, int qty){
    this.name = name;
    this.quantity = qty;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getQuantity() {
    return quantity;
}
public void setQuantity(int quantity) {
    this.quantity = quantity;
}
}

и класс репозитория предметов

public class ItemRepository extends CouchDbRepositorySupport<Item>{

public ItemRepository(CouchDbConnector db) {
        super(Item.class, db);
        initStandardDesignDocument();
}
@GenerateView @Override
public List<Item> getAll() {
    ViewQuery q = createQuery("all").descending(true);
    return db.queryView(q, Item.class);
}

и контроллер предметов

public class ItemController {
ItemRepository itemRepository;

public String viewAll() {
    List<Item> items = itemRepository.getAll();        
    return items.toString();
}
}

У меня есть класс CouchDBConnector, который добавляется как интерфейс javascript:

public class CouchDBConnector {
private WebView webView;
private DroidGap droidGap;
private CouchDbConnector db ;
private CouchDbInstance dbInstance;
private ItemController itemController;
private ItemRepository repo;

public CouchDBConnector(DroidGap gap, WebView view) {
    this.webView = view;
    this.droidGap = gap;
}

public void init(){
    HttpClient httpClient = new StdHttpClient.Builder()
            .host("localhost")
            .port(5984)
            .build();

    dbInstance = new StdCouchDbInstance(httpClient);
    db = new StdCouchDbConnector("itemdatabase", dbInstance);
    repo = new ItemRepository(db);
    itemController = new ItemController();
}

public String getAllItems(){
    String prefix = "Items \n";

    return prefix + repo.getAll().toString();
}

public void add(String item_name, String qty){
    repo.add(new Item(item_name, Integer.parseInt(qty)));
    return;
}
public void update(String item_name, String qty){
    repo.update(new Item(item_name, Integer.parseInt(qty)));
    return;
}
public void delete(String item_name, String qty){
    repo.remove(new Item(item_name, Integer.parseInt(qty)));
    return;
}
}

На HTML-странице приложения PhoneGap я пытаюсь вызвать класс CouchDBConnector, чтобы получить все документы или строку «Элементы не найдены», но получаю исключения нулевого указателя. Вот трассировка стека:

`12-14 16:12:45.273: I/dalvikvm(675): java.lang.NullPointerException:
12-14 16:12:45.273: I/dalvikvm(675):    at com.phonegap.TestDB.CouchDBConnector.getAllItems(CouchDBConnector.java:44)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:115)
12-14 16:12:45.273: I/dalvikvm(675):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 16:12:45.273: I/dalvikvm(675):    at android.os.Looper.loop(Looper.java:137)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:722)
12-14 16:12:45.283: I/dalvikvm(675):    at java.lang.Thread.run(Thread.java:856)
12-14 16:12:45.293: I/dalvikvm(675): "WebViewCoreThread" prio=5 tid=11 NATIVE
12-14 16:12:45.303: I/dalvikvm(675):   | group="main" sCount=0 dsCount=0 obj=0x41381ca0 self=0x1dbf90
12-14 16:12:45.303: I/dalvikvm(675):   | sysTid=688 nice=0 sched=0/0 cgrp=default handle=1748120
12-14 16:12:45.312: I/dalvikvm(675):   | schedstat=( 3460347960 1824920390 1206 ) utm=321 stm=24 core=0
12-14 16:12:45.312: I/dalvikvm(675):   at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.312: I/dalvikvm(675):   at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.323: I/dalvikvm(675):   at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:115)
12-14 16:12:45.323: I/dalvikvm(675):   at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 16:12:45.323: I/dalvikvm(675):   at android.os.Looper.loop(Looper.java:137)
12-14 16:12:45.333: I/dalvikvm(675):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:722)
12-14 16:12:45.343: I/dalvikvm(675):   at java.lang.Thread.run(Thread.java:856)

person Neha    schedule 15.12.2011    source источник


Ответы (1)


Похоже, вы забыли вызвать init() из своего конструктора, потому что NPE находится в getAllItems(), поэтому либо repo, либо null, либо repo.getAll().

person Amos M. Carpenter    schedule 15.12.2011
comment
Это было частью проблемы. Я сделал несколько ошибок. Забыл использовать @TypeDiscriminator - person Neha; 16.12.2011
comment
Трассировка стека — ваш друг — она сообщает вам, где именно выбрасываются исключения NullPointerException, если у вас есть исходный код. В подобных случаях вы также можете использовать отладчик для размещения точек останова на строках или непосредственно перед ними, которые вызывают проблемы, для проверки значений во время выполнения непосредственно перед тем, как вы доберетесь до своей ошибки. Когда эти методы не помогают, все усложняется ;-) - person Amos M. Carpenter; 16.12.2011