2013-03-26 3 views
0

JSONData를 읽을 권한이 있고 이제는 "이름"키를 콤보 상자에 표시하려고합니다. 하지만 내 문자열 Array nullpointerexception 얻을. JSON 객체를 바로 defaultComboBoxModel에 보내려고했습니다. 하지만 그것은 String 배열이 될 필요가 있기 때문에 모든 것을 변환하면 null이됩니다. 배열이 null이되는 이유는 무엇입니까?내 JSON 데이터를 콤보 상자에 표시하는 방법은 무엇입니까?

내 코드 :

import java.util.ArrayList; 
import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 


public class Planner { 

    private String startingLocation; 
    private String destination; 
    private static Planner planner = null; 
    private int id; 
    private JSONArray array; 
    ArrayList myList = new ArrayList(); 

    public static Planner getPlanner(){ 

     if (planner == null){ 

      planner = new Planner(); 

     } 

     return planner; 

    } 

    public void setStartingLocation(String from) { 

     this.startingLocation = from;  

    } 

    public void setDestination(String dest) { 

     this.destination = dest; 

    } 

    public String getStartingLocation() { 

     return startingLocation; 

    } 

    public String getDestination() { 

     return destination; 

    } 


    public void setID(int id) { 

     this.id = id; 

    } 

    public void setLocationName (JSONArray array){ 

     this.array = (JSONArray) array; 

    } 

    public String[] getLocationName(){ 

     System.out.println(this.array.size()); 

     for (int i=0; i<this.array.size(); i++){ 

      myList = (ArrayList) this.array.get(i); 
      myList.add(i, array); 

     } 

     System.out.println(myList); 

    return (String[]) myList.toArray(); 

    } 

} 

public void parseJsonData() throws ParseException { 

     JSONParser parser = new JSONParser(); 
     Object obj = parser.parse(jsonData); 
     JSONObject topObject = (JSONObject) obj; 
     JSONObject locationList = (JSONObject) topObject.get("LocationList"); 
     JSONArray array = (JSONArray) locationList.get("StopLocation"); 
     Iterator<JSONObject> iterator = array.iterator(); 
     String name = null; 

     while (iterator.hasNext()) { 

      JSONObject jsonObj = (JSONObject) iterator.next(); 
      Planner.getPlanner().setLocationName(array); 

     } 

    } 

final DefaultComboBoxModel model = new DefaultComboBoxModel(Planner.getPlanner().getLocationName()); 
     comboBox = new JComboBox(model); 
+0

NPE는 어디에서 발생합니까? 코드를 디버그 했습니까? – Thomas

+0

GUI를 디버깅하는 데에도 작동하지 않습니다. 심지어 전에 열리지도 않습니다. – Josef

+0

최종 DefaultComboBoxModel 모델 = 새 DefaultComboBoxModel (Planner.getPlanner(). getLocationName()); comboBox = 새 JComboBox (모델); 모델을 콤보 박스에 보내지는 않지만 절대 점프하여 예외를 던지며 시작도 시작하지 않습니다. – Josef

답변

0

내가 코드 스타일 또는 디자인 결함에 대해 언급하지 않을 것이다, 그러나 여기에서 벌레처럼 보이는 몇 줄 수 있습니다

for (int i=0; i<this.array.size(); i++){ 
     myList = (ArrayList) this.array.get(i); 
     myList.add(i, array); 
} 

myListArrayList이다가와 비록 내가 JSONArrayarray이 실제로 포함되어 있는지 알 수는 없지만 문자열 또는 JSONObject 인스턴스가 포함되어있는 경우 array.get(i)에서 ArrayList으로 캐스팅 된 인스턴스의 경우 0이됩니다.. array에 다른 JSONArray이 포함되어 있으면 발생하지 않을 수 있습니다.

다음 줄은 꽤 이상합니다. array.get(i)이 실제로 목록을 반환한다고 가정하면 해당 목록을 myList으로 지정한 다음 그 목록에 배열을 추가하면 순환 참조 (array)에 array 등이 포함 된 목록이 포함됩니다.

다음으로, 원하지 않을 수도있는 모든 반복에서 myList을 대체합니다.

public String[] getLocationName(){ 

    System.out.println(this.array.size()); 

    List<String> resultList = new LinkedList<String>();   

    for (int i=0; i<this.array.size(); i++){ 
     //cast the inner array to a list of Strings (assuming it only contains Strings) 
     List<String> innerList = (ArrayList) this.array.get(i); 

     //add the inner list to the result list 
     resultList.addAll(innerList); 

    } 

    System.out.println(resultList); 

    return resultList.toArray(new String[resultList.size()]); 
} 

당신이 변환 것이 방법 :

arrayJSONArray istances을 포함 가정 할 때,이 같은 뭔가 방법이 변경 될 수 있습니다, JSONArrayArrayList는 (따라서 더 ClassCastException 없다) 확장과 내부 배열은 문자열을 포함 문자열 목록 (즉 JSONArrayString을 포함하는 JSONArray 포함) 목록을 문자열의 플랫 목록에 추가하고이를 배열로 반환하십시오.

+0

같은 장소에서 nullpointer가 작동하지 않습니다. – Josef

+0

배열은 JSONObjects가있는 JSONArray입니다. – Josef

+0

NPE가 발생하는 정확한 행을 표시하십시오 (줄 번호 만 입력하지 마십시오!). 또한 배열에 JSONObject가 포함되어 있으면 'ArrayList'로 캐스팅하지 않아도됩니다. 그 외에도 현재 요소에서 location 속성을 추출해야합니다. – Thomas

관련 문제