Почему я получаю «Исключение в потоке» основной «java.lang.NumberFormat: null…» после нажатия кнопки «Отмена»?

1

После запуска программы открывается окно, и есть две кнопки. Если я нажму кнопку "Отмена", программа выйдет, но я получаю это сообщение: 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.");
   }
}
Теги:
nested-loops
switch-statement
io

2 ответа

1

Проблема в том, что если вы отмените диалог, 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).

1

Когда вы нажимаете "Отмена" в поле ввода JOptionPane, фактически происходит то, что переменной, которая считывает ввод, присваивается пустое значение, исключение возникает, когда он пытается проанализировать это в целых числах, поскольку значение null не является целым числом. Попробуйте использовать инструкцию try-catch чтобы предотвратить сбой программы при нажатии отмены. В качестве дополнительного бонуса это также помешало бы проблеме от других недопустимых входов, таких как буквы.

Просто изменение соответствующей части этого должно сделать трюк.

try{
  int rows = Integer.parseInt(
                    JOptionPane.showInputDialog(
                                 "How many rows? (-1 to quit)"));
}catch(Exception e){
  return;
}

Вы можете изменить return; в конце заявления, чтобы вы хотели появиться в случае возникновения исключения. Однако, оставляя return; в конце позволит пользователю повторно ввести вход.

Ещё вопросы

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