2015-03-03 3 views
-3

Здравствуйте, я продолжаю получать NullPointerException на item.setProduct(trans.getProduct().getName()); Можете ли вы рассказать, почему и как? Я не вижу причин, почему это будет null, поскольку я установил свой адаптер в методе onPostExecute. Благодаря!nullPointerException on AsyncTask doInBackground response

private class TransactionTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 

     BackendService service = BackendAPI.serviceApi(); 
     TransactionObject transactionList; 

     Log.e("AsyncTask", "I'm called"); 

     try { 
      transactionList = service.listTransactions(15); 
      if (transactionList != null) { 
       Log.e(TAG, transactionList.toString()); 
       loadListViewData(transactionList); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public void loadListViewData(TransactionObject transObj) { 

     item = new SalesItem(); 

     Iterator<Transaction> transactionList = transObj.getTransactions().iterator(); 
     Transaction trans = null; 

     while (transactionList.hasNext()) { 
      trans = transactionList.next(); 

      item.setProduct(trans.getProduct().getName()); 
      item.setCost(trans.getCost()); 
      item.setName(trans.getUser().getName()); 
      item.setDate(trans.getCreated_at()); 
      item.setId(trans.getId()); 
      transaction.add(item); 
     } 

    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     adapter = new SalesListAdapter(getActivity(), transaction); 
     listview.setAdapter(adapter); 
    } 
} 

вот мой журнал

`03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ java.lang.NullPointerException 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at net.payswitch.switchmobile.fragments.SalesDataFragment$TransactionTask.loadListViewData(SalesDataFragment.java:188) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at net.payswitch.switchmobile.fragments.SalesDataFragment$TransactionTask.doInBackground(SalesDataFragment.java:166) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at net.payswitch.switchmobile.fragments.SalesDataFragment$TransactionTask.doInBackground(SalesDataFragment.java:152) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
03-03 07:40:52.604 2011-2033/net.payswitch.switchmobile W/System.err﹕ at java.lang.Thread.run(Thread.java:856)` 
+0

У вас нет 'Продукта' в вашем' trans', скорее всего. Вы проверили свой объект 'trans'? –

+0

Возможно, 'trans.getProduct();' или 'trans.getProduct(). GetName()' is null – Jens

+0

Возможный дубликат [Что такое Null Pointer Exception и как его исправить?] (Http: // stackoverflow .com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – Jens

ответ

0

вот следить за: (класс SalesItem на другой файл)

public class SalesItem { 

private String product; 
private String cost; 
private String name; 
private String date; 
private String id; 

public String getProduct() { 
    return product; 
} 

public void setProduct(String product) { 
    this.product = product; 
} 

public String getCost() { 
    return cost; 
} 

public void setCost(String cost) { 
    this.cost = cost; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getDate() { 
    return date; 
} 

public void setDate(String date) { 
    this.date = date; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

}

ниже объявление находится внутри родительский класс, поэтому они объявлены глобально

private ArrayList<SalesItem> transaction; 
private SalesItem item; 
+0

И у вас есть 'transaction = new ArrayList <>();' который инициализирует его? –

+0

да у меня есть это. – Menardo

0

У вас возникли проблемы с item. Вы создаете один new SalesItem(), а затем вы перебираете список транзакций. Это означает, что после того, как первый SalesItem добавлен в transaction, вы должны изменитьSalesItem уже в transaction, а так же добавить . Несомненно, это не намеренное поведение. Решение заключается в перемещении new SalesItem() внутри петли while.

Для NullPointerException, добавить проверку на каждом этапе, где вы можете иметь null и записывать явную ошибку, если вы хотите, чтобы перейти к следующему элементу в списке, или сделать assert или войти с Log.wtf(...), если это не должно произойти:

public static final String MY_ACTIVITY = "MyActivity"; 

public void loadListViewData(TransactionObject transObj) { 

     //item = new SalesItem(); moved inside loop 

     Iterator<Transaction> transactionList = transObj.getTransactions().iterator(); 
     Transaction trans = null; 

     while (transactionList.hasNext()) { 
      trans = transactionList.next(); 
      if (tran==null) { 
       Log.e(MY_ACTIVITY, "trans is null"); 
       continue; 
      } 
      if (tran.getProduct()==null) { 
       Log.e(MY_ACTIVITY, "Product is null for transId: "+trans.getId()); 
       continue; 
      } 
      if (tran.getUser()==null) { 
       Log.e(MY_ACTIVITY, "User is null for transId: "+trans.getId(); 
       continue; 
      } 
      item = new SalesItem(); 

      item.setProduct(trans.getProduct().getName()); 
      item.setCost(trans.getCost()); 
      item.setName(trans.getUser().getName()); 
      item.setDate(trans.getCreated_at()); 
      item.setId(trans.getId()); 
      transaction.add(item); 
     } 

    } 
+0

Я вижу. Благодарю. Я попробую это. – Menardo

Смежные вопросы