0

JSONData を読み取ることができたので、「name」キーをコンボボックスに表示したいと考えています。しかし、文字列配列の nullpointerexception が発生します。JSON オブジェクトを defaultComboBoxModel に直接送信しようとする前に。しかし、文字列配列である必要があるため、変換するとすべてがnullになりました。配列が null になるのはなぜですか?

私のコード:

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); 
4

1 に答える 1

0

コード スタイルや設計上の欠陥についてはコメントしませんが、バグのように見える行をいくつか示します。

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

myListはandですが、実際にArrayList何が含まれているかはわかりませんが、文字列またはインスタンスのいずれかが含まれている場合、キャストすると. 他の が含まれている場合は、発生しない可能性があります。arrayJSONArrayJSONObjectarray.get(i)ArrayListClassCastExceptionarrayJSONArray

次の行もかなり奇妙です。array.get(i)実際にリストを返すと仮定すると、そのリストを仮定myListしてからそのリストに配列を追加すると、循環参照が発生します(array含むリストを含むarrayなど)。

次に、あなたがmyList望むものではないかもしれないすべての反復で置き換えています。

インスタンスがあり、extends があり (したがって はありません)、内側の配列に文字列がarray含まれていると仮定すると、メソッドを次のように変更できます。JSONArrayJSONArrayArrayListClassCastException

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()]);
}

このようにして、文字列のリストのリスト (つまりJSONArray、 を含むJSONArrayを含むString) を文字列のフラットなリストに変換し、それを配列として返します。

于 2013-03-26T13:08:07.920 に答える