Java: Почему этот код не работает?

#java

#java

Вопрос:

Может кто-нибудь сказать мне, что не так с этим Java-кодом?
Этот массив является : static String [][] data = new String[6][2]; Но в этом случае data[0][1]="abcd" и data[1][1]="efgh" , остальные data[2-5][1] должны быть null . Я просто пытаюсь распечатать не- null те. При (j=2,k=3) после этого код не выполняется. Например, «Я здесь 3» не печатается.

 int k=1;  
System.out.println("data[2][0]=" data[2][0]);  

for(int j=0; j<data.length; j  ,k  ) {
    System.out.println("j=" j " k=" k);

    if (!(data[j][0].equals("null"))) {
        System.out.println("I am here2");
        sbissues = sbissues.append("n");
        sbissues = sbissues.append(k);
        sbissues = sbissues.append(".  ");
        sbissues = sbissues.append(data[j][1]);
    }

    System.out.println("sbissues=" sbissues.toString());
    System.out.println("I am here1");
}
System.out.println("I am here3");
  

Результат выглядит следующим образом:

 data[2][0]=null  
j=0 k=1  
I am here2  
sbissues=  
1.  abcd  
I am here1  
j=1 k=2  
I am here2  
sbissues=  
1.  abcd  
2.  efgh  
I am here1  
j=2 k=3  
  

Проблема в том, что я никогда не достигаю «Я здесь 3».
Спасибо, ребята, за ответы, все они правильные (использовать !=null вместо .equals). Думаю, я не могу проголосовать за всех вас, мне разрешено проголосовать только один раз.

Комментарии:

1. каков был ожидаемый результат приведенного выше кода?

2. есть ли какие-либо ошибки? я не вижу ошибок, если вы получаете выходные данные, что вы пытаетесь сделать?

3. … и как это data определяется? (или каково его содержимое)

4. Да, я не вижу в этом ничего плохого, он ведет себя именно так, как я и ожидал

5. Этот массив: статическая строка [][] данные = новая строка[6][2]; Но в этом случае данные [0] [1]=»abcd» и данные [1][1]=»efgh», остальные должны быть равны нулю. Я просто пытаюсь распечатать ненулевые значения. При (j = 2, k = 3) код после этого не выполняется.

Ответ №1:

Я предполагаю, что вы не хотите, чтобы он печатал что-либо, когда оно равно null.

Используйте это для вашего оператора if вместо:

 if (data[j][0] != null) {
  

В Java комплексные переменные являются ссылками на объекты. У вас могут быть две переменные, указывающие на один и тот же объект. Когда переменная ни на что не указывает, тогда она равна null. Вы не можете разыменовать нулевую переменную, вот когда вы получаете исключение NullPointerException.

Примитивные типы данных, такие как int, long, byte и т.д., Ведут себя по-разному. Каждый раз, когда вы назначаете, вы делаете копию данных. Они не могут быть нулевыми.

Комментарии:

1. Спасибо, это работает! Но почему?? Поскольку data[j][0] имеет тип String, не следует ли мне использовать data[j][0].равно (null) вместо !=

2. null не имеет equals() метода. null это не Object или что-то в этом роде. Это просто ничто . Любая попытка получить к нему доступ / вызвать его с помощью оператора period . приведет только к NullPointerException (теперь имя исключения имеет для вас более осмысленное значение?)

Ответ №2:

Прежде всего, вы выполняете итерацию только в одном измерении (с обеими переменными j и k ). Я предполагаю, что вы хотели выполнить итерацию по двум измерениям вашей структуры данных (таким образом, вам понадобилось бы почти два for цикла). Итак, я бы начал с чего-то вроде:

  for (int j=0; j<data.length; j  ) {
     for (int k=0; k<data[j].length; k  ) {
          // ... here goes the printing
     }
 }
  

Комментарии:

1. Сначала я пропустил это, но операция увеличивает k в цикле for j . Сначала я подумал, что он хотел сделать то, что вы говорите, но потом я посмотрел на использование k, и, похоже, они не предназначены для того, чтобы быть индексом второго уровня в его массиве данных, это больше похоже на счетчик на основе 1.

2. Хотя k кажется бесполезным, массив, похоже, имеет размеры [n] [2]. Похоже, что каждый элемент в массиве представляет собой пару ключ-значение.

3. Да, я видел, что k это всегда j 1 так, но я предполагаю, что это не входило в намерения OP. Я думаю, мы никогда не узнаем.

Ответ №3:

Как и другие, я не уверен, что пытается сделать ваш код. Из того, что я могу сказать, есть несколько ошибок, которые мы должны исправить. Возможно, исправление этого заставит его делать то, что вы хотите.

Первый…

 if (!(data[j][0].equals("null"))) {
  

Это должно быть…

 if (data[j][0] != null) {
  

Второй…

При проверке if вы проверяете, имеет ли data[j][0] значение null. Затем, в последней строке блока if, вы используете data[j][1] . Я предполагаю, что это должны быть одинаковые, а не разные индексы? Или, может быть, вы хотели использовать k для индексации в?

Последние…

Вы повторно используете экземпляр StringBuilder для каждой итерации. toString() Метод не очищает свой буфер. Если вы ожидаете выводить разные вещи, попробуйте удалять экземпляр SB в конце каждой итерации цикла. Если вы собираетесь добавить к любой существующей строке, то вы делаете это правильно.

Ответ №4:

Вы должны получать NullPointerException . Вы опубликовали все свои выходные данные? Перенаправляете ли вы stdout или stderr при запуске своей программы?


Комментарии OP,

Спасибо, это работает! Но почему?? Поскольку data[j][0] имеет тип String, не следует ли мне использовать data[j][0].равно (null) вместо !=

Нет, потому что, если data[j][0] есть null , попытка вызвать equals() на нем вызовет NullPointerException . Вы не можете получить доступ к методам или полям объекта, который не существует.

Кстати, это NullPointerException должно было быть видно в вашем выводе. Вы видели что-нибудь подобное?

Комментарии:

1. Привет, Эриксон, Нет, я не видел исключение NullPointerException на консоли, только все мои инструкции print. Это тест Junit в Eclipse.

2. @stumped — Если вы нажмете на неудачный тест на панели JUnit, вы сможете увидеть NullPointerException трассировку стека. (Я думаю; я использую TestNG, но я думаю, что их пользовательские интерфейсы похожи.)

Ответ №5:

Для начала, если str == null , то

 str.equals("null")
  

генерирует NullPointerException . Поэтому вы можете захотеть изменить

 if (!(data[j][0].equals("null"))) {
  

в

 if (data[j][0] != null) {
  

Затем, учитывая инициализацию

 data[2][0] = "hello";
data[2][1] = "world";
  

Программа будет печатать (я удалил "I am here" ы):

 data[2][0]=hello
j=0 k=1
sbissues=
j=1 k=2
sbissues=
j=2 k=3
sbissues=
3.  world
j=3 k=4
sbissues=
3.  world        <----
j=4 k=5
sbissues=
3.  world
j=5 k=6
sbissues=
3.  world
  

Причина, по которой вы не получаете никаких выходных данных для случая

 data[0][1]="abcd"
data[1][1]="efgh"
        ^ both values put in column 1 (will not affect the data[j][0] check!)
  

это потому, что вы добавляете материал только в sbissues том случае, если столбец 0 не равен нулю.

В приведенных выше назначениях вы устанавливаете значение только для столбца 1, т. Е. никакие строки в вашей матрице не будут запускать операторы if.