Переменная массива String [] показывает нулевое значение, хотя я задаю ему значение - PullRequest
1 голос
/ 21 декабря 2009

У меня есть строковая переменная

static String[] genrename;

Я присваиваю значения одному из моих методов, а затем отображаю его содержимое. Это хранит значение штрафа. Но когда я обращаюсь к переменным String напрямую или из метода getter (). Показывает нулевое значение в строке.

Есть идеи?

public class GenreParsing {
    static int entries;
    static String[] genrecode;
    static String[] genrename;
    public GenreParsing() {
    }
    public void parsing(String returnContent) {
        try {
            JSONObject jo_genres = new JSONObject(returnContent);
            System.out.println(jo_genres);
            JSONArray ja_genres = jo_genres.getJSONArray("genres");
            System.out.println(ja_genres);
            entries=ja_genres.length();
            for (int i = 1; i < entries; i++) {
                JSONObject jo_genre = (JSONObject) ja_genres.get(i);
                JSONArray ja_genre = jo_genre.getJSONArray("genre");
                JSONObject genreinfo = (JSONObject) ja_genre.get(0);
                genrecode = new String[entries];
                genrename = new String[entries];
                genrecode[i] = genreinfo.getString("code");
                genrename[i] = genreinfo.getString("name");
                System.out.println(genrecode[i]);
                System.out.println(genrename[i]);
            }
        }
        catch (JSONException e) {
            e.printStackTrace();
        } 
    }
    public int no_of_entries() {
        System.out.println(entries);
        return entries;
    }
    public String getgenrecode(int x) {
        System.out.print(genrecode[x]);
        return genrecode[x];
    }
    public String getgenrename(int y) {
        return genrename[y];
    }
}

Ответы [ 4 ]

3 голосов
/ 21 декабря 2009

Вы перезаписываете свой массив снова и снова, делая

genrecode=new String[entries];
genrename=new String[entries];

в цикле. Поместите это перед циклом.

2 голосов
/ 21 декабря 2009

Почему вы делаете genrecode=new String[entries]; и genrename=new String[entries]; внутри цикла? Это создает новый строковый массив каждый раз в цикле, аннулируя предыдущие назначения.

Попробуйте вместо этого:

genrecode=new String[entries];
genrename=new String[entries];
for(int i = 0; i < entries; i++) {
    JSONObject jo_genre = (JSONObject) ja_genres.get(i);
    JSONArray ja_genre=jo_genre.getJSONArray("genre");
    JSONObject genreinfo = (JSONObject) ja_genre.get(0);
    genrecode[i]= genreinfo.getString("code");
    genrename[i] = genreinfo.getString("name");
    System.out.println(genrecode[i]);
    System.out.println(genrename[i]);
}

Он создает достаточно большой массив заранее и заполняет все элементы массива. Я также изменил начальное значение для i в приведенном выше коде, потому что индексы массива обычно начинаются с нуля, а не с одного. Вы можете проверить это.

И последнее, на что стоит обратить внимание - это статика. Если ваш класс когда-либо выделен как несколько экземпляров, в этом случае они могут перезаписать данные друг друга (особенно в многопоточной программе, где вы не можете легко определять последовательность). Сделав их частными для экземпляра, вы предотвратите это.

Опять же, это зависит от того, как вы используете класс. Если это синглтон, это не имеет значения (пока), но я склонен планировать заранее - вы не знаете, когда захотите изменить его на не-синглтон, и вы ничего не потеряете (на мой взгляд), используя переменные экземпляра даже для одного.

1 голос
/ 21 декабря 2009

Необходимо сделать все переменные экземпляра полей, чтобы множественные экземпляры не мешали.

public class GenreParsing {
 private int entries;
 private String[] genrecode;
 private String[] genrename;
}

Кроме того, это всегда хороший стиль для обеспечения надлежащей инкапсуляции путем ограничения доступа к внутреннему состоянию класса.

Вам следует соблюдать следующие правила Java Coding и правильно обрабатывать исключения.

0 голосов
/ 21 декабря 2009

возможно string[n] элемент равен null, а не сам массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...