Как вы печатаете сообщение об ошибке при попытке ввести отрицательное значение в массив?

1

Как печатать сообщение об ошибке в Java, когда данные вводятся в массив.

Код:

for (rows = 0; rows < bandstand.length; rows++){
     System.out.print ("Please enter number of positions in row " + (char)(rows + (int) 'A'));
     columns = keyboard.nextInt();
     bandstand[rows] = new double [columns];
     while ( columns < 0){
         System.out.print ("ERROR: Out of range, try again:");
         columns = keyboard.nextInt();
     }

 }

Исключение:

Exception in thread "main" java.lang.NegativeArraySizeException.

Теги:
arrays

3 ответа

1

У вас есть несколько вариантов, насколько это необходимо, но в большинстве случаев все они включают просто проверку того, что значение columns имеет смысл до создания массива (ваша основная ошибка пытается создать массив, прежде чем пытаться повторно запрашивать действительный ввод). Например, вы можете, скажем, неоднократно запрашивать пользователя для ввода:

for (rows = 0; rows < bandstand.length; rows++){
    do {
        System.out.print ("Please enter number of positions in row " + (char)(rows + (int) 'A'));
        columns = keyboard.nextInt();
    } while (columns < 0);
    ...

Или, если требуется специальное сообщение об ошибке, похожее на то, что вы сейчас:

for (rows = 0; rows < bandstand.length; rows++){
    System.out.print ("Please enter number of positions in row " + (char)(rows + (int) 'A'));
    columns = keyboard.nextInt();
    while (columns < 0) {
        System.out.print ("ERROR: Out of range, try again:");
        columns = keyboard.nextInt();
    }
    ...
    // note that array is created *after* columns is validated

Вы также можете выполнить аналогичную вещь (учитывая вашу текущую логику), выполнив:

for (rows = 0; rows < bandstand.length; rows++){
    System.out.print ("Please enter number of positions in row " + (char)(rows + (int) 'A'));
    columns = keyboard.nextInt();
    if (columns < 0) {
        System.out.println("Columns must be >= 0!");
        continue; // starts over for this row
    }
    ...

Общая цель состоит в том, чтобы гарантировать, что независимо от того, к какому моменту создания массива, columns >= 0.

Вы также можете поймать NegativeArraySizeException затем вернуться назад и снова спросить, но я бы рекомендовал против этого в этой ситуации прежде всего потому, что ваш код будет немного сложнее (попробуйте, как упражнение). В общем случае этот подход имеет несколько проблем; например, к моменту исключения исключений вы знаете, что columns отрицательны, но вы не знаете, почему - у вас есть дополнительная информация во время ввода значения, чем вы делаете в то время, когда значение неправильно используется (что более важно в более сложные программы), и, таким образом, вы можете обрабатывать ошибку более значимым образом (например, печатать ошибку и запрашивать ввод снова), среди других причин, которые находятся за пределами области действия здесь.

  • 0
    Согласовано. Я думаю, что будет хорошей идеей использовать блок « try и catch в качестве упражнения. Слово совет -> Убедитесь , что вы понимаете этот код очень хорошо , прежде чем делать это. Я встречал многих программистов, которые двигались слишком быстро и не были в курсе основных концепций. В конце концов они всегда сталкиваются с чем-то, что расшатывает то, что они думали, что поняли в начале. Не воспринимайте это как разочарование, однако вы должны быть осторожны с ритмом. Это поможет вам в конце, я обещаю. ;)
0

Просто переместив while цикл до линии, которая устанавливает bandstand[rows] будет выполнять то, что я думаю, что вы хотите:

for (rows = 0; rows < bandstand.length; rows++){
     System.out.print ("Please enter number of positions in row " + (char)(rows + (int) 'A'));
     columns = keyboard.nextInt();
     while ( columns < 0){
         System.out.print ("ERROR: Out of range, try again:");
         columns = keyboard.nextInt();
     }
     bandstand[rows] = new double [columns];

 }

Когда во while цикла будет завершен, вы будете уверены, что columns >= 0 и, следовательно, new double[columns] будут работать.

-2
for (rows = 0; rows < bandstand.length; rows++){
 System.out.print ("Please enter number of positions in row " + (char)(rows + (int) 'A'));
 columns = keyboard.nextInt();
 if(columns >= 0) { 
     bandstand[rows] = new double [columns];
  }
 while ( columns < 0){
     System.out.print ("ERROR: Out of range, try again:");
     columns = keyboard.nextInt();
 }

}
}

Убедитесь, что столбцы больше или равны нулю перед вставкой в массив.

Однако ваша следующая в while логика утверждения кажется неправильной.

  • 0
    Извините, перерыв if () не был уместен ранее.
  • 0
    Это все еще не имеет особого смысла; вы не создаете bandstand[rows] после получения нового ввода.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню