Как выдать ошибку диалогового окна, если пользователь вводит случайные буквы JOptionPane

Итак, я новичок в java, и я пытаюсь использовать try and catch. Например, если я спрошу, сколько винограда у пользователя, и он наберет кучу букв, он покажет диалоговое окно с ошибкой, а не просто системную ошибку. Я смог сделать это со сканером, но не с JOptionPane. Я действительно хочу, чтобы появилось диалоговое окно, поэтому я пытаюсь использовать JOptionPane.showInputDialog.

Сканер который работает...=

import java.util.Scanner;

class test {
    public static void main (String[] args)
    {

        Scanner input = new Scanner(System.in);

        System.out.println("How many grapes do u have?");
        int grapes = 1;
        try
        {
            grapes = input.nextInt();
        }
        catch (Exception e)
        {
            System.out.println("Good job Sherlock you broke the program");
            return;
        }
        int mg;

        if (grapes >= 100)
            mg = 1;

        else
            mg = 2;

        switch (mg){
            case 1: System.out.println("You got a lot of grapes");
                break;
            case 2: System.out.println("You brarely got any grapes");
                break;
        }
    }
}

JOptionPane, который не работает...

import javax.swing.JOptionPane;

public class bday
{
    public static void main(String[] args)
    {
        String age = "0";
        try
        {
            age = JOptionPane.showInputDialog("What was your age yesterday?");
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, "Thanks a lot, you broke it. CYA later.");
            return;
        }
        int iage = Integer.parseInt(age);

        String bday = "0";

         try
         {
             bday = JOptionPane.showInputDialog("Was yesterday your B-Day? (True or False)");
         }
         catch (Exception e)
         {
            JOptionPane.showMessageDialog(null, "WHY U MESS UP PROGRAM???.... BYE BYE!!");
            return;
         }
         boolean bage = Boolean.parseBoolean(bday);
        if (bage == true){
            iage += 1;
            JOptionPane.showMessageDialog(null, "You are now " + iage);
        }
        else if (bage == false){
            JOptionPane.showMessageDialog(null, "Happy unbirthday!");
        }
        if (iage ==10){
            JOptionPane.showMessageDialog(null, "Congrats, double digits!");
        }
        if (iage >19){
            JOptionPane.showMessageDialog(null,  "U aint a Teenager");
        }
        else if (iage < 13)
            JOptionPane.showMessageDialog(null,  "U aint a Teenager");          

    }
}

person EmptyStuff    schedule 18.07.2013    source источник


Ответы (2)


Вы пытаетесь/ловите не то. Вы должны поместить операторы синтаксического анализа в блок try, так как это вызывает исключение.

например, не

    String age = "0";
    try
    {
        age = JOptionPane.showInputDialog("What was your age yesterday?");
    }
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null, "Thanks a lot, you broke it. CYA later.");
        return;
    }
    int iage = Integer.parseInt(age);

скорее:

String age = JOptionPane.showInputDialog("What was your age yesterday?");
try {
  iage = Integer.parseInt(age);
} catch (NumberFormatException nfe) {
  // show error
}  

Кроме того, вам следует избегать перехвата Exception, а следует перехватывать только определенные исключения, здесь NumberFormatException.


Изменить
В комментарии вы спрашиваете:

Еще один вопрос, должен ли я сделать то же самое с логическим значением?

Логический тип немного сложнее (на мой взгляд), когда дело доходит до синтаксического анализа. Чтобы увидеть, как работает Boolean.parseBoolean(...), ознакомьтесь с Boolean API, особенно метод parseBoolean. Вы увидите, что он не генерирует исключение NumberFormatException, если введенный текст не имеет смысла. API сообщит вам, что на самом деле возвращается. Блок try/catch здесь не сработает. Рассмотрите возможность использования String equalsIgnoreCase(...), если вам нужно отловить ошибки.

person Hovercraft Full Of Eels    schedule 18.07.2013
comment
Неважно, я думаю, что знаю, что вы имеете в виду. Я попробую это. Спасибо за ответы. - person EmptyStuff; 19.07.2013
comment
@ user2593789: сначала объявите его, прежде чем использовать. - person Hovercraft Full Of Eels; 19.07.2013
comment
Это работает, моя проблема заключалась в том, что я дважды пытался назначить переменную. СПАСИБО ОГРОМНОЕ!!!! - person EmptyStuff; 19.07.2013
comment
Еще один вопрос, должен ли я сделать то же самое с логическим значением? - person EmptyStuff; 19.07.2013
comment
любая идея, что я должен сделать код. Или я должен просто отказаться от логического значения и присвоить true 1 и false 2 и сделать то, что вы сделали выше? - person EmptyStuff; 19.07.2013

Посмотрите на строку, где он терпит неудачу. Я подозреваю, что это boolean bage = Boolean.parseBoolean(bday);. Вы можете сохранить что угодно в строке, но преобразование «чего угодно» в логическое значение может завершиться ошибкой.

Поместите это в свой файл try/catch.

person pyb    schedule 18.07.2013