마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

xml에 데이터 불러오는데 NUllPointerException이 나요..

0 추천

try catch문이라 어디서발생하는지도 잘 모르겠어요.. 도와주실수 있나요.. 저의 xml파일은 

<?xml version = "1.0" encoding = "utf-8" ?>
<node>
<checkio>수입</checkio>
<money>1000</money>
<checkio>지출</checkio>
<money>-2000</money>
</node>

'이렇게 생겼는데 

 

checkio.size()하면 2가 나오더라고요 근데 

for(i=0;checkio.size();i++){

system.out.println(checkio.get(i));

}

 이렇게 하면 나오는데  이 checkio.get(i)를 다른곳에다 가 넣을라고 하면 첫번째 값은 불러와 지는데 두번째 값에서 NullPointerException이 나와요.. 

좀 도와주시겠어요? 

몇시간동안했는데도 잘 모르겠어요..

package com.account.real;
	import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.BarChart.Type;
import org.achartengine.model.CategorySeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.widget.LinearLayout;
	  
	public class ChartActivity extends Activity {  
		private final String SERVER_ADDRESS = "http://--";
		String Email = com.account.real.LoginActivity.userEmail;
		Date date;
		long now;
		String a;
		SimpleDateFormat format;
		LinearLayout ll ;
		//차트 그리기 위한 
		List<double[]> values;
		List<String> title = new ArrayList<String>();
		ArrayList<String> checkio ;
		XYMultipleSeriesRenderer renderer;//그래픽 속성 지정객체
		XYMultipleSeriesDataset dataset ; //설정 
		Context context  = ChartActivity.this;
	    public void onCreate(Bundle savedInstanceState) {  
	        super.onCreate(savedInstanceState);  
	        setContentView(R.layout.activity_chart);  
	        ll = (LinearLayout)findViewById(R.id.llBody); 
	        
	        now = System.currentTimeMillis();
	        date=new Date(now);
	        format = new SimpleDateFormat("yyyy/MM/dd");
	        a = format.format(date);
	       
	        final Handler handler = new Handler();
					handler.post(new Runnable() {
						public void run() {
							try{
								
						        URL url = new URL(SERVER_ADDRESS + "/chart2.php?" 
						        		+ "Email=" + URLEncoder.encode(Email, "UTF-8")
						        		+ "&Day=" + URLEncoder.encode(a, "UTF-8"));
						        System.out.println(url);
						        url.openStream();
						        checkio = getXmlDataList("chart2result.xml", "checkio");
						        ArrayList<String> money = getXmlDataList("chart2result.xml", "money");
						        
						        renderer = new XYMultipleSeriesRenderer();
						        
                            	for (int k = 0; k < checkio.size(); k++) {  
                            		
                            		if(money.get(k).contains("-"))
                            		{
                            			String m = money.get(k).substring(1);
                            			System.out.println(Double.parseDouble(m));
                            			values.add(new double[]{ Double.valueOf(m) });
                            			
                            		}else
                            		{
                            			String m = money.get(k);
                            			System.out.println(Double.parseDouble(m));
		                            	values.add(new double[]{ Double.valueOf(money.get(k)) });
		                            }  
                            		
                            	}
                            	
                            	 renderer.setXTitle("분류");  
                                 renderer.setYTitle("원");  
                                 
                                 renderer.setAxesColor(Color.WHITE);  
                                 
                                 renderer.setLabelsColor(Color.CYAN);  
                                 renderer.setXLabelsAlign(Align.LEFT);  
                                 renderer.setYLabelsAlign(Align.LEFT);  
                                 renderer.setPanEnabled(false, false);  
                                 renderer.setZoomEnabled(false, false);  
                                  renderer.setZoomRate(1.0f);  
                                   renderer.setBarSpacing(0.5f);
                                 for (int i = 0; i < checkio.size(); i++) {  
                                	 CategorySeries series = new CategorySeries(checkio.get(i));  //여기서 예외가 나오는것 같습니다....
                                     double[] v = values.get(i);  
                                     int seriesLength = v.length;  
                                     for (int k = 0; k < seriesLength; k++) {  
                                         series.add(v[k]);  
                                     }  
                                     dataset.addSeries(series.toXYSeries());  
                                 } 
                                
                                 GraphicalView gv = ChartFactory.getBarChartView(context, dataset,renderer, Type.DEFAULT); 
             					 ll.addView(gv);      
	                         }catch(Exception e){System.out.println(e+"B");}
						}
					});
					
					
				}

	   
	    
	    public boolean onKeyDown(int keyCode, KeyEvent event) {
 	       switch(keyCode) {
 	         case KeyEvent.KEYCODE_BACK:
 	        	 	finish();
 	        	    Intent chartback = new Intent(   getApplicationContext(), HomeActivity.class  );
 		        	startActivity(chartback);
 	                   return false;
 	           default:
 	           return false;
 	     }
 	  }
	    
	    private ArrayList<String> getXmlDataList(String filename, String str) { 
	        String rss = SERVER_ADDRESS + "/";
	        ArrayList<String> ret = new ArrayList<String>();
	         
	        try { //XML 파싱을 위한 과정
	            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
	            factory.setNamespaceAware(true);
	            XmlPullParser xpp = factory.newPullParser();
	            URL server = new URL(rss + filename);
	            InputStream is = server.openStream();
	            xpp.setInput(is, "UTF-8");
	             
	            int eventType = xpp.getEventType();
	             
	            while(eventType != XmlPullParser.END_DOCUMENT) {
	                if(eventType == XmlPullParser.START_TAG) {
	                    if(xpp.getName().equals(str)) {
	                        ret.add(xpp.nextText());
	                    }
	                }
	                eventType = xpp.next();
	            }
	        } catch(Exception e) {
	            System.out.println(e+"B");
	        }
	         
	        return ret;
	    }
	   
	}

 

익명사용자 님이 2014년 8월 1일 질문

1개의 답변

0 추천

1. 이렇게 봐선 모르겠지만...

ret.add(xpp.nextText()); 

이부분에 로그를 찍어보세요... ㅎㅎ;

String data =  xpp.nextText();

Log.v("TAG", data);

ret.add(data);

 

2. 그리고 xml 데이터 형식에도 문제가 있어 보입니다. 

<?xml version = "1.0" encoding = "utf-8" ?>
<node>
<item>
<checkio>수입</checkio>
<money>1000</money>
</item>
<item>
<checkio>지출</checkio>
<money>-2000</money>
</item>
</node>
더 좋은 방법도있지만..
예를 들면 이런 식으로 만들면 더 좋을것 같아요... 
 
ArrayList<String>  >>  ArrayLlist<Item>
형태로 모델을 만들어서 한번에 파싱 하는데..
여러므로.. 좋을것 같네요...
 
3. 안드로이드에서 system.out.println 보다는 Log.v(tag, log); 형식으로 쓰시는걸 추천 드립니다...
 
 
Yong-Yong (3,500 포인트) 님이 2014년 8월 1일 답변
...