Как печатать сообщение об ошибке в 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.
У вас есть несколько вариантов, насколько это необходимо, но в большинстве случаев все они включают просто проверку того, что значение 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
отрицательны, но вы не знаете, почему - у вас есть дополнительная информация во время ввода значения, чем вы делаете в то время, когда значение неправильно используется (что более важно в более сложные программы), и, таким образом, вы можете обрабатывать ошибку более значимым образом (например, печатать ошибку и запрашивать ввод снова), среди других причин, которые находятся за пределами области действия здесь.
Просто переместив 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]
будут работать.
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
логика утверждения кажется неправильной.
bandstand[rows]
после получения нового ввода.
try
иcatch
в качестве упражнения. Слово совет -> Убедитесь , что вы понимаете этот код очень хорошо , прежде чем делать это. Я встречал многих программистов, которые двигались слишком быстро и не были в курсе основных концепций. В конце концов они всегда сталкиваются с чем-то, что расшатывает то, что они думали, что поняли в начале. Не воспринимайте это как разочарование, однако вы должны быть осторожны с ритмом. Это поможет вам в конце, я обещаю. ;)