После запуска программы открывается окно, и есть две кнопки. Если я нажму кнопку "Отмена", программа выйдет, но я получаю это сообщение: Exception in thread "main"java.lang.NumberFormat: null...
Может кто-нибудь объяснить, что это такое и как его исправить? Благодарю.
import javax.swing.JOptionPane;
import java.io.*;
public class Driver12 //class
{
public static void main(String[] args)
{
while(true)
{
int rows = Integer.parseInt(
JOptionPane.showInputDialog("How many rows? (-1 to quit)"));
if(rows == -1)
{
System.out.println("Bye-bye!");
System.exit(0);
}
String message = "What type? (1-4)";
message = message + "\n1. Standard";
message = message + "\n2. Backward";
message = message + "\n3. Pyramid";
message = message + "\n4. Box with X";
int type = Integer.parseInt(JOptionPane.showInputDialog(message));
switch(type)
{
case 1: standard(rows);
break;
case 2: backward(rows);
break;
case 3: pyramid(rows);
break;
case 4: box(rows);
break;
default: System.out.println("Not a valid type.");
break;
}
System.out.println();
}
}
public static void standard(int n)
{
for(int r = 1; r <= n; r++)
{
for(int c = 1; c <= r; c++)
System.out.print("*");
System.out.println();
}
}
public static void backward(int n)
{
System.out.println("This type is not currently supported.");
}
public static void pyramid(int n)
{
System.out.println("This type is not currently supported.");
}
public static void box(int n)
{
System.out.println("This type is not currently supported.");
}
}
Проблема в том, что если вы отмените диалог, JOptionPane.showInputDialog
вернет null
поэтому Integer.parseInt
выбрасывает NumberFormatException
.
Вы можете решить это, заменив
int type = Integer.parseInt(JOptionPane.showInputDialog(message));
с
String input = JOptionPane.showInputDialog(message);
int type = input == null ? -1 : Integer.parseInt(input);
Однако лучшим решением было бы не использовать Integer.parseInt
вообще. Вы можете просто switch
String
возвращаемую JOptionPane.showInputDialog(message)
.
Когда вы нажимаете "Отмена" в поле ввода JOptionPane
, фактически происходит то, что переменной, которая считывает ввод, присваивается пустое значение, исключение возникает, когда он пытается проанализировать это в целых числах, поскольку значение null не является целым числом. Попробуйте использовать инструкцию try-catch
чтобы предотвратить сбой программы при нажатии отмены. В качестве дополнительного бонуса это также помешало бы проблеме от других недопустимых входов, таких как буквы.
Просто изменение соответствующей части этого должно сделать трюк.
try{
int rows = Integer.parseInt(
JOptionPane.showInputDialog(
"How many rows? (-1 to quit)"));
}catch(Exception e){
return;
}
Вы можете изменить return;
в конце заявления, чтобы вы хотели появиться в случае возникновения исключения. Однако, оставляя return;
в конце позволит пользователю повторно ввести вход.