2013-06-18 3 views
0

간단한 xml 파싱 응용 프로그램을 만들려고합니다. 그러나 유감스럽게도 코드를 실행하는 동안 오류가있는 것으로 보입니다. 아무도 나를 도울 수 없습니까? 감사합니다Xml NullException 구문 분석

MainActivity.java

public class MainActivity extends Activity { 
    Button button; 
    ListView listView; 
    List<WorldPopulation> employees = null; 
    ProgressDialog mProgressDialog; 

    static final String RANK = "rank"; 
    static final String COUNTRY = "country"; 
    static final String POPULATION = "population"; 

    ListView listview; 
    ArrayAdapter<WorldPopulation> adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listview); 
     new DownloadXML().execute(); 
    } 

    private class DownloadXML extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      mProgressDialog = new ProgressDialog(MainActivity.this); 

      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.setIndeterminate(false); 

      mProgressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      employees = new ArrayList<WorldPopulation>(); 

      XMLParser parser = new XMLParser(); 

      String xml = parser 
        .getXmlFromUrl("My Secret URL"); 

      Document doc = parser.getDomElement(xml); 
      try { 
       NodeList nl = doc.getElementsByTagName("ranking"); 
       for (int i = 0; i < nl.getLength(); i++) { 
        Element e = (Element) nl.item(i); 
        WorldPopulation employee = new WorldPopulation(); 
        employee.setRank(parser.getValue(e, RANK)); 
        employee.setCountry(parser.getValue(e, COUNTRY)); 
        employee.setPopulation(parser.getValue(e, POPULATION)); 

        employees.add(employee); 
       } 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void args) { 


      listview = (ListView) findViewById(R.id.listview); 
      adapter = new ArrayAdapter<WorldPopulation>(MainActivity.this, 
        R.layout.list_item, employees); 
      listView.setAdapter(adapter); 
      mProgressDialog.dismiss(); 
     } 
    } 

} 

Worldpopulation.class

public class WorldPopulation { 
    private String rank; 
    private String country; 
    private String population; 

    public String getRank() { 
     return rank; 
    } 


    public void setRank(String rank) { 
     this.rank = rank; 
    } 


    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

    public String getPopulation() { 
     return population; 
    } 


    public void setPopulation(String population) { 
     this.population = population; 
    } 

} 

로그 캣 :

06-18 14:26:16.377: E/AndroidRuntime(22886): FATAL EXCEPTION: main 
06-18 14:26:16.377: E/AndroidRuntime(22886): java.lang.NullPointerException 
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.example.exampleparse.MainActivity$DownloadXML.onPostExecute(MainActivity.java:89) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.example.exampleparse.MainActivity$DownloadXML.onPostExecute(MainActivity.java:1) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.AsyncTask.finish(AsyncTask.java:602) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.os.Looper.loop(Looper.java:137) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at android.app.ActivityThread.main(ActivityThread.java:4507) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at java.lang.reflect.Method.invokeNative(Native Method) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at java.lang.reflect.Method.invoke(Method.java:511) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
06-18 14:26:16.377: E/AndroidRuntime(22886): at dalvik.system.NativeStart.main(Native Method) 

편집

public class MainActivity extends Activity { 
    Button button; 
    ListView listView; 
    List<WorldPopulation> employees = null; 

    ProgressDialog mProgressDialog; 

    static final String RANK = "rank"; 
    static final String COUNTRY = "country"; 
    static final String POPULATION = "population"; 

    ListView listview; 
    ArrayAdapter<WorldPopulation> adapter; 
    private Context context; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listview_main); 

     new DownloadXML().execute(); 
    } 
    public void DownloadXML(Context context) { 
     this.context = context; 
    } 
    private class DownloadXML extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      mProgressDialog = new ProgressDialog(MainActivity.this); 

      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.setIndeterminate(false); 

      mProgressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      employees = new ArrayList<WorldPopulation>(); 

      XMLParser parser = new XMLParser(); 

      String xml = parser 
        .getXmlFromUrl("MY Secret URL"); 

      Document doc = parser.getDomElement(xml); 
      try { 
       NodeList nl = doc.getElementsByTagName("ranking"); 
       for (int i = 0; i < nl.getLength(); i++) { 
        Element e = (Element) nl.item(i); 
        WorldPopulation employee = new WorldPopulation(); 
        employee.setRank(parser.getValue(e, RANK)); 
        employee.setCountry(parser.getValue(e, COUNTRY)); 
        employee.setPopulation(parser.getValue(e, POPULATION)); 

        employees.add(employee); 
       } 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void args) { 

      listview = (ListView) ((Activity) context).findViewById(R.id.listview); 

      adapter = new ArrayAdapter<WorldPopulation>(MainActivity.this, 
        R.layout.list_item, employees); 
      listView.setAdapter(adapter); 
      mProgressDialog.dismiss(); 
     } 
    } 

} 

로그 캣 :

06-18 15:29:47.267: E/AndroidRuntime(31737): FATAL EXCEPTION: main 
06-18 15:29:47.267: E/AndroidRuntime(31737): java.lang.NullPointerException 
06-18 15:29:47.267: E/AndroidRuntime(31737): at com.example.exampleparse.MainActivity$DownloadXML.onPostExecute(MainActivity.java:92) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at com.example.exampleparse.MainActivity$DownloadXML.onPostExecute(MainActivity.java:1) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at android.os.AsyncTask.finish(AsyncTask.java:602) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at android.os.Looper.loop(Looper.java:137) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at android.app.ActivityThread.main(ActivityThread.java:4507) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at java.lang.reflect.Method.invokeNative(Native Method) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at java.lang.reflect.Method.invoke(Method.java:511) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
06-18 15:29:47.267: E/AndroidRuntime(31737): at dalvik.system.NativeStart.main(Native Method) 
+0

oncreate 메소드가 시작될 때 listview initizlize를 이동하십시오. – Riser

+0

나는 그 오류가 아니라고 생각한다. 어떤 응용 프로그램을 중지합니다 – Riser

+0

죄송합니다, 나는 같은 오류가 발생합니다. –

답변

1

문제는, 당신이 당신의 컨텍스트에서 findViewById를 호출해야한다는 것입니다 그렇지 않으면보기를 찾을 수 없습니다. 이처럼 onPostExecute()에서 줄을 변경하는

봅니다 :

listview = (ListView) MainActivity.this.findViewById(R.id.listview); 

나는 문맥을 필요로 개인 필드에 저장 AsyncTask를위한 생성자를 구현하는 것이 좋습니다 것입니다.

public DownloadXML(Context context) { 
    this.context = context; 
} 

하고 다음 당신은 단순히 당신의 활동에

listview = (ListView) context.findViewById(R.id.listview); 

을 할 수있는 것은이 같은 AsyncTask를 만들기 :

new DownloadXML(MainActivity.this).execute(); 

방법이다 그. 생성자를 구현해야합니다. 여기 해결책은 :

public class MainActivity extends Activity { 
Button button; 
ListView listView; 
List<WorldPopulation> employees = null; 

ProgressDialog mProgressDialog; 

static final String RANK = "rank"; 
static final String COUNTRY = "country"; 
static final String POPULATION = "population"; 

ListView listview; 
ArrayAdapter<WorldPopulation> adapter; 
private Context context; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listview_main); 

    new DownloadXML(MainActivity.this).execute(); 
} 

private class DownloadXML extends AsyncTask<Void, Void, Void> { 

    private Context context; 

    public void DownloadXML(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     mProgressDialog = new ProgressDialog(MainActivity.this); 

     mProgressDialog.setMessage("Loading..."); 
     mProgressDialog.setIndeterminate(false); 

     mProgressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     employees = new ArrayList<WorldPopulation>(); 

     XMLParser parser = new XMLParser(); 

     String xml = parser 
       .getXmlFromUrl("MY Secret URL"); 

     Document doc = parser.getDomElement(xml); 
     try { 
      NodeList nl = doc.getElementsByTagName("ranking"); 
      for (int i = 0; i < nl.getLength(); i++) { 
       Element e = (Element) nl.item(i); 
       WorldPopulation employee = new WorldPopulation(); 
       employee.setRank(parser.getValue(e, RANK)); 
       employee.setCountry(parser.getValue(e, COUNTRY)); 
       employee.setPopulation(parser.getValue(e, POPULATION)); 

       employees.add(employee); 
      } 
     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void args) { 

     listview = (ListView) ((Activity) context).findViewById(R.id.listview); 

     adapter = new ArrayAdapter<WorldPopulation>(MainActivity.this, 
       R.layout.list_item, employees); 
     listView.setAdapter(adapter); 
     mProgressDialog.dismiss(); 
    } 
} 
} 
+0

제 편집을 확인하십시오. 나는 아직도 그것을 couldnt한다. –