2015-06-13 4 views
0

Я работаю над 2 программами для школы, один из них, чтобы получить контактную информацию и сохранить ее в текстовом файле, а другой - читать из текстового файла. Все работает отлично, но я должен добавить блок try/catch, который принимает входные данные, чтобы он мог улавливать нечисловые записи в текстовом поле возраста. Я пробовал много разных способов сделать это со вчерашнего дня, и ничего не работало. Ниже приведен код. Если кто-то может указать мне в правильном направлении, я был бы очень благодарен, потому что я чувствую, что есть что-то фундаментальное, чего я не получаю здесь. Благодаряблок try/catch не работает в actionlistener

private class SaveData implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 

      String age1 = (String)ageField.getText(); 
      int age = Integer.parseInt(age1); 

      try{ 
       int a = age; 
      } 
      catch(InputMismatchException e1){ 
       JOptionPane.showMessageDialog(null, "Please enter an  Integer"); 
      } 

      String name = (String)nameField.getText(); 
      String email = (String)emailField.getText(); 
      String cell = (String)cellField.getText(); 

      if(age>= 0 && age<=120){ 
       outputFile.println("Name: " + name); 
       outputFile.println("Age: " + age); 
       outputFile.println("Email: " + email); 
       outputFile.println("Cell #: " +cell); 
       outputFile.println("---------------------------"); 

       nameField.setText(""); 
       ageField.setText(""); 
       emailField.setText(""); 
       cellField.setText(""); 
      } 
      else{ 
       JOptionPane.showMessageDialog(null, "You have entered an invalid age \n " + 
             "Please enter an age between 0 and 120", 
               "Age Entry Error",  JOptionPane.ERROR_MESSAGE); 

       nameField.setText(""); 
       ageField.setText(""); 
       emailField.setText(""); 
       cellField.setText(""); 
      }//end else 
     }//end actionperformed 
    }//end actionlistener 
+0

'int a = age;' никогда не будет генерировать исключение. Переместите 'Integer.parseInt' внутри' try' – twentylemon

+0

Если вы нашли ответ, вы должны разместить его здесь и пометить этот вопрос как решенный. – codehitman

ответ

1

Поэтому в основном я вижу три проблем (в том числе тех, которые вы не имеющих проблемы с- еще):

  • Функция parseInt бросает исключение, но вы не ловили его, потому что это не в try блок.
  • Вы попадаете в неправильное исключение, поэтому его никогда не поймают. Вы можете прочитать Javadoc для этого исключения here.
  • Переменная age недоступна за пределами блока try/catch из-за правил съемки.

Вот как вы должны это сделать:

String age1 = (String)ageField.getText(); int age = -1;//always assign a variable a default value try{ age = Integer.parseInt(age1); } catch(NumberFormatException err){ JOptionPane.showMessageDialog(null, "Please enter a valid Integer!"); }

Окончательная мысль, если вы поймать исключение, то вы должны отобразить сообщение об ошибке (что вы делаете), а затем вернуться от функция. Таким образом, в этом блоке catch должен быть возвращен, так как вы не хотите продолжать выполнять дальнейший код. Скорее всего, произойдет сбой, так как он ожидает действительное значение age.

+0

Большое спасибо. Я сделал рекомендуемые изменения, и все работает отлично. Удивительный профиль pic между прочим. – sammyb123

+0

@ sammyb123 рад помочь :) – codehitman

2

Просто запишите int age = Integer.parseInt(age1); эти строки внутри TRY/поймать блока и поймать для NumberFormatException Exception.

+0

Я пробовал это, но тогда возрастная переменная не будет распознана вне блока try-catch. Весь другой код, который записывает данные в файл, не будет работать. Есть ли работа вокруг этого? – sammyb123

+0

int age = 0; try { age = Integer.parseInt (age1); } Здесь объявлена ​​переменная вне блока try, но инициализируется внутри блока. – Sagar

Смежные вопросы