Как да дадете грешка в диалоговия прозорец, ако потребителят въведе произволни букви 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 няма да работи тук. Обмислете използването на equalsIgnoreCase(...) на String, ако трябва да прихванете грешки.

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);. Вие сте свободни да запазите всичко в низ, но преобразуването на „каквото и да е“ в булево може да се провали.

Поставете го във вашия опит/улов.

person pyb    schedule 18.07.2013