2013-12-16 2 views
1

Android에서 Yelps API v2를 사용하여 쿼리 결과를 구문 분석하려고합니다. 올바른 JSON을 얻고 있지만 어떤 이유 때문에 Null Pointer Exception 오류가 발생합니다. 다음은 일부 코드 단편입니다.Yelp API v2 JSON 널 포인터 예외 구문 분석

class RetreiveSearchResults extends AsyncTask<String, Void, Void> { 
@Override 
protected Void doInBackground(String... terms) { 
expListView = (ExpandableListView) findViewById(R.id.lvExp); 


OAuthService service = new ServiceBuilder().provider(YelpApi2.class).apiKey("myKey").apiSecret("myKey").build(); 
Token accessToken = new Token("wKXleYnSD0RH_qhj-myKey-UG", "myKey"); 
OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.yelp.com/v2/search"); 
request.addQuerystringParameter("location", "Waterfront, Boston, MA"); 
request.addQuerystringParameter("category", category); 
service.signRequest(accessToken, request); 
Response response = request.send(); 
String rawData = response.getBody(); 

try { 
    JSONObject json = new JSONObject(rawData); 
    JSONArray businesses; 
    businesses = json.getJSONArray("businesses"); 
    for (int i = 0; i < businesses.length(); i++) { 
      JSONObject business = businesses.getJSONObject(i); 
      businessNames.add(business.getString("name")); 
    } 
for(int j = 0; j < businessNames.size(); j++){ 
    listDataChild.put(businessNames.get(j), businessInfo); 
} 
} catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

ERROR : 라인 125 위에서 businessNames.add(business.getString("name"));이다

.

12-16 14:45:46.854: E/AndroidRuntime(28707): FATAL EXCEPTION: AsyncTask #2 
12-16 14:45:46.854: E/AndroidRuntime(28707): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-16 14:45:46.854: E/AndroidRuntime(28707): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.lang.Thread.run(Thread.java:856) 
12-16 14:45:46.854: E/AndroidRuntime(28707): Caused by: java.lang.NullPointerException 
12-16 14:45:46.854: E/AndroidRuntime(28707): at com.td.rssreader.CoffeeResultActivity$RetreiveSearchResults.doInBackground(CoffeeResultActivity.java:125) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at com.td.rssreader.CoffeeResultActivity$RetreiveSearchResults.doInBackground(CoffeeResultActivity.java:1) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
12-16 14:45:46.854: E/AndroidRuntime(28707): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
12-16 14:45:46.854: E/AndroidRuntime(28707): ... 5 more 

는 내가 처음 business 된 JSONObject의 출력을 기록하고 이것은 당신이 볼 수 있듯이 내가받은 JSON 출력 ...

{ 
    "rating_img_url_large":"http:\/\/s3-media4.ak.yelpcdn.com\/assets\/2\/www\/img\/9f83790ff7f6\/ico\/stars\/v1\/stars_large_4_half.png", 
    "snippet_text":"Last night got off to a somewhat inauspicious start. As usual, I was dependent on my GPS to get us to our destination for the evening. Also as usual, I also...", 
    "phone":"6176549900", 
    "menu_date_updated":1383451144, 
    "rating_img_url":"http:\/\/s3-media2.ak.yelpcdn.com\/assets\/2\/www\/img\/99493c12711e\/ico\/stars\/v1\/stars_4_half.png", 
    "location":{ 
     "neighborhoods":[ 
     "Waterfront", 
     "Leather District", 
     "South Boston" 
    ], 
    "state_code":"MA", 
    "display_address":[ 
    "9 East St", 
    "Waterfront", 
    "Boston, MA 02111" 
    ], 
    "address":[ 
    "9 East St" 
    ], 
    "country_code":"US", 
    "postal_code":"02111", 
    "city":"Boston" 
    }, 
    "menu_provider":"single_platform", 
    "review_count":340, 
    "is_closed":false, 
    "is_claimed":true, 
    "rating_img_url_small":"http:\/\/s3-media2.ak.yelpcdn.com\/assets\/2\/www\/img\/a5221e66bc70\/ico\/stars\/v1\/stars_small_4_half.png", 
    "url":"http:\/\/www.yelp.com\/biz\/o-ya-boston", 
    "id":"o-ya-boston", 
    "image_url":"http:\/\/s3-media3.ak.yelpcdn.com\/bphoto\/pyRoQtCY4ou8_VvSikmidw\/ms.jpg", 
    "name":"O Ya", 
    "display_phone":"+1-617-654-9900", 
    "snippet_image_url":"http:\/\/s3-media4.ak.yelpcdn.com\/photo\/QLLDC2CmRvTvFjullAC7tg\/ms.jpg", 
    "mobile_url":"http:\/\/m.yelp.com\/biz\/o-ya-boston", 
    "categories":[ 
     [ 
     "Japanese", 
     "japanese" 
     ] 
    ], 
    "rating":4.5 
} 

입니다. "이름"은 거기에있다. 그러나 나는 그것을 부여 잡을 수 없다.

답변

1

businessNames 개체가 선언되었거나 코드의 아무 곳에서나 초기화 된 것을 볼 수 없습니다. 나는 당신이 그것을 어딘가에 선언했지만 그것을 초기화하지 않았을 것이다. 또한 "rating"값은 String인데도 Integer이 아니므로 .getString(), innit을 사용하지 마십시오.

+0

비즈니스 이름은 클래스 맨 위에 선언 된 문자열 목록입니다. 나는 "등급"대신 "이름"을 가져야했습니다. 나는 그것을 편집했다. 코드의 스 니펫을 제공했음을 기억하십시오. 모든 것이 선언되었습니다. – Zack

+0

글쎄요, 두 가지 가능성이 있습니다 : businessNames 객체가 null이거나 비즈니스 객체가 null입니다. 중단 점 및 디버그 퍼스펙티브 또는 로그 문과 함께 있는지 확인하십시오. – FWeigl

+0

내가 어떻게 내 arraylists를 올바르게 시작하지 않았는지 불평했다. 즉, List businessNames = new ArrayList ();'. 그래서 그것은 고정되어 있지만 지금은 내 hashmap이 올바르게 시작되지 않는다고 불평하고 있습니다. 'HashMap > listDataChild;'어떻게하면됩니까? 내 코드에 추가 된 for 루프를 참조하십시오. – Zack