簡體   English   中英

JAVA:objet Set ::第一個.add(object)錯誤

[英]JAVA: objet Set:: error with the first .add(object)

我正在嘗試使用Set。 但是我第一次出現add()函數時出錯。-innerSetException(futurTask.java:273)-setException(FutureTask.java:124)。 所以我真的不明白...我真的希望你能幫助我! 這是我的代碼:

    public class RetrieveArticleTask extends AsyncTask<Void, Void, Set<Article>> {

private List<Article> articles;
private List<Article> products ;
private Set<Article> productsUpdates;

private LoginTaskListener  callbackArticlesReceived;

public RetrieveArticleTask(AutoCompletionActivity  callback) {
    this.articles  = new ArrayList<Article>(200);
    this.products  = new ArrayList<Article>(200);
    this.productsUpdates = new TreeSet<Article>();

    this.callbackArticlesReceived = callback;           
}               

@Override
protected Set<Article> doInBackground(Void... aVoid) {

    try {
        List<ArticleResult> articleResults = RetailReloadWebServicesArticle.getListArticlesAll();

        for(ArticleResult articleResult : articleResults ){ 
            articles.add(new Article(articleResult));
            System.out.println(productsUpdates.size());
            productsUpdates.add(new Article(articleResult));
        }
        System.out.println("article size : " + articles.size());
    } catch (ITException e) {
        e.printStackTrace();
        System.out.println("ERROR   :::" +e);
    }


    try {
        products = RetailReloadApplication.getSqliteOpenHelper().getArticleDao().getAllObjects();
    } catch (ITException e) {
        e.printStackTrace();
    }
    System.out.println(products.size());
    for(Article product : products ){ 
        productsUpdates.add(product);
    }



    try {
        if(productsUpdates != null){
            for(Article productUpdate : productsUpdates ){ 
                RetailReloadApplication.getSqliteOpenHelper().getArticleDao().addOrUpdateObject(productUpdate);
            }
        }
    } catch (ITException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return productsUpdates;
}

@Override
protected void onPostExecute(Set<Article> articles) {
    System.out.println(articles.size());
    if (null != callbackArticlesReceived)
        callbackArticlesReceived.onLoginTaskFinished(articles);
}

}

這是完整的堆棧跟蹤:這是堆棧跟蹤:

07-04 08:13:17.322: E/AndroidRuntime(652): java.lang.RuntimeException: An error occured while executing doInBackground()
07-04 08:13:17.322: E/AndroidRuntime(652):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-04 08:13:17.322: E/AndroidRuntime(652):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.lang.Thread.run(Thread.java:856)
07-04 08:13:17.322: E/AndroidRuntime(652): Caused by: java.lang.ClassCastException: com.retailreload.service.model.result.article.ArticleResult is not Comparable
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.TreeMap.find(TreeMap.java:254)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.TreeMap.putInternal(TreeMap.java:240)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.TreeMap.put(TreeMap.java:186)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.TreeSet.add(TreeSet.java:113)
07-04 08:13:17.322: E/AndroidRuntime(652):  at com.retailreload.task.RetrieveArticleTask.doInBackground(RetrieveArticleTask.java:48)
07-04 08:13:17.322: E/AndroidRuntime(652):  at com.retailreload.task.RetrieveArticleTask.doInBackground(RetrieveArticleTask.java:1)
07-04 08:13:17.322: E/AndroidRuntime(652):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-04 08:13:17.322: E/AndroidRuntime(652):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-04 08:13:17.322: E/AndroidRuntime(652):  ... 5 more

您正在將不可比較的對象添加到TreeSet中。 當您將一個對象添加到TreeSet時,該TreeSet將被自動排序,並且在這里java找不到找到對Article對象進行排序的方法,因為您似乎沒有提供。

如果您不關心排序,請將TreeSet更改為HashSet。 如果您關心它,那么Article類必須實現Comparable接口,或者在構建TreeSet時可以提供Comparator對象。

請參閱TreeSet 文檔

這是Article類的示例:

public class Article implements Comparable<Article> {
    private String name;
    private int price;

    //Constructors, getters and setters

    @Override
    public int compareTo(Article a) {
        return this.name.compareTo(a.name);
    }
}

這里的Article對象將按名稱排序。 compareTo方法必須返回一個整數:

  • 如果“本”條款少於提供的“ a”項,則為否定
  • 如果等於則為零
  • 如果大於“ a”,則為正

使用您需要的排序邏輯來實現該接口和compareTo方法,它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM