2016-07-22 52 views
0

我想從使用AsynTask的Internet獲取國家/地區微調器的數據。我得到了NoClassDefFoundError,我查了一下,common-io-2.5.jar在類路徑中。我正在使用Eclipse。代碼在聲明Type標記時崩潰。 我不知道如何解決這個問題,請幫助我。非常感謝你!無法修復NoClassDefFoundError

package fantasticmassage.com; 

import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Comparator; 

import org.json.JSONObject; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.renderscript.Type; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 

import org.apache.commons.io.IOUtils; 

import com.google.gson.Gson; 
import com.google.gson.annotations.SerializedName; 
import com.google.gson.reflect.TypeToken; 

public class CountrySpinner extends Activity{ 
    private Spinner spnCountry; 
    private ArrayList<Country> countries; 
    private ArrayAdapter<Country> spnCountryAdapter; 

    public CountrySpinner(){ 

    } 
    public CountrySpinner(Spinner spn){ 
     this.spnCountry = spn; 
    } 
    public CountrySpinner(Spinner spn, ArrayAdapter<Country> adapter){ 
     this.spnCountry = spn; 
     this.spnCountryAdapter = adapter; 
    } 

    public void getDataForCountrySpinner(){ 
     new CountrySpinnerAsync().execute(); 
    } 
    public class CountrySpinnerAsync extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
      System.out.println("onPreExecute: passed"); 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      try { 
       URL url = new URL("http://leansigmaway.com/api/ca_api/api.php?type=getCountries"); 
       HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 
       httpURLConnection.connect(); 
       String result = IOUtils.toString(httpURLConnection.getInputStream(), "UTF-8"); 
       JSONObject jsonObject = new JSONObject(result); 
       String countryList = jsonObject.getJSONArray("result").toString(); 
       Type token = (Type) new TypeToken<ArrayList<Country>>(){}.getType();//Look like it crashes right here 
       System.out.println("doInBacground, token: " + token); 

       Gson gson = new Gson(); 
       countries = gson.fromJson(countryList, (java.lang.reflect.Type) token); 

       spnCountryAdapter = new ArrayAdapter<Country>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, countries); 
       spnCountryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

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

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid){ 
      super.onPostExecute(aVoid); 
      spnCountry.setAdapter(spnCountryAdapter); 
     } 
    } 

    private class Country implements Comparator<Country> { 

     @SerializedName("id") 
     private int countryID; 

     @SerializedName("name") 
     private String countryName; 

     public Country() { 
     } 

     public Country(int countryID, String countryName) { 
      this.countryID = countryID; 
      this.countryName = countryName; 
     } 

     public int getCountryID() { 
      return countryID; 
     } 

     public void setCountryID(int countryID) { 
      this.countryID = countryID; 
     } 

     public String getCountryName() { 
      return countryName; 
     } 

     public void setCountryName(String countryName) { 
      this.countryName = countryName; 
     } 

     @Override 
     public String toString() { 
      return countryName; 
     } 


     @Override 
     public int compare(Country lhs, Country rhs) { 
      return lhs.getCountryName().compareTo(rhs.getCountryName()); 
     } 
    } 

} 

和日誌文件:

07-21 22:00:59.378: E/AndroidRuntime(1948): FATAL EXCEPTION: AsyncTask #1 
07-21 22:00:59.378: E/AndroidRuntime(1948): Process: fantasticmassage.com, PID: 1948 
07-21 22:00:59.378: E/AndroidRuntime(1948): java.lang.RuntimeException: An error occured while executing doInBackground() 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.lang.Thread.run(Thread.java:818) 
07-21 22:00:59.378: E/AndroidRuntime(1948): Caused by: java.lang.NoClassDefFoundError: fantasticmassage.com.CountrySpinner$CountrySpinnerAsync$1 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at fantasticmassage.com.CountrySpinner$CountrySpinnerAsync.doInBackground(CountrySpinner.java:74) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at fantasticmassage.com.CountrySpinner$CountrySpinnerAsync.doInBackground(CountrySpinner.java:1) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
07-21 22:00:59.378: E/AndroidRuntime(1948):  ... 4 more 
+0

我認爲範圍是問題,所以更改私人類國家公共類國家 – Vickyexpert

+0

你試過我的解決方案? –

+0

你沒有在你的活動中包含生命週期方法(如oncreate,onResume) – SaravInfern

回答

-3

Clean your projectrebuild它再次..大多數的問題,如NoClassDefFoundError將解決這樣的問題。

+1

是的,我需要清理項目,謝謝! –

+0

@ M.N然後你可以批准這個答案作爲正確的答案 –

+1

Ajay,我做了,謝謝!我沒有看到棒圖標,我也是新手。 –

0

從官方文檔,這個例外是因爲

拋出拋出當Java虛擬機或ClassLoader實例試圖在加載定義一個類(作爲常規方法調用的一部分或作爲使用新表達式創建新實例的一部分),並且不能找到該類的定義。

所以我認爲你在第一行代碼中給你的類定義給出錯誤的路徑。嘗試在package關鍵字之後給出正確的路徑並解決您的問題。希望能幫助到你!

0

在我的情況下NoClassDefFoundError錯誤我做了下面的方法。這對我有用。

轉到Project Name Right Click -> Properties -> Java Build Path -> Order and Export -> common-io-2.5.jar (Check this jar)

Click common-io-2.5.jar -> Click Up (in right side panel) -> Ok

這可能會解決你的問題。

+1

我沒有看到共同體io項目如何幫助解決問題 –

+0

它適用於我@ cricket_007 –

+0

當然,但它聽起來像你修復了Commons IO中缺少的類,這不是問題所在失蹤。 –