-1

晚上好,

我正在为一个介绍性的 java 类做作业,该类要求我使用 switch 和 try 语句来验证用户输入。Java 应用程序的用户应输入与数据类型相关的数字(1 - 字符串、2 - 整数、3 - 双精度或 4 - 退出)。该数字应该被验证,但无论数据是否有效,验证过程总是抛出异常。完成此操作后,该用户应该能够输入数据并让应用程序验证所述输入数据确实属于所选数据类型。鉴于我一直遇到抛出的异常,我什至无法测试这部分代码,但可以肯定它不会工作,因为我看到三个未使用的变量,根据我的文本,应该使用(strTryString 、strTryInt 和 strTryDouble)。我可以' t 在脑海中建立联系,在最初选择数据类型时,程序会说“用户选择了 double,将 input[strTryDouble?] 与 double 数据类型的参数进行比较”。对此的任何帮助将不胜感激。到目前为止,这是我所拥有的:

import java.io.*;
import javax.swing.JOptionPane;

public class MyType
{
    public static void main(String[] args)
    {
        // declare class variables
        String strChoice, strTryString, strTryInt, StrTryDouble;
        int choice, tryInt;
        double tryDouble;
        boolean done = false;

        // loop while not done
        while(!done)
        {
            try
            {
                strChoice = JOptionPane.showInputDialog(null, "What's my type\n\n\n1) String\n2) integer\n3) double\n4) Quit the program");

                choice = Integer.parseInt(JOptionPane.showInputDialog(null,strChoice));

                switch(choice)
                {
                    case 1:
                        JOptionPane.showMessageDialog(null, "Correct, any input can be saved as a String.");
                        break;

                    case 2:
                        tryInt = Integer.parseInt(strTryInt);
                        JOptionPane.showMessageDialog(null, "Correct.");
                        break;

                    case 3:
                        tryDouble = Double.parseDouble(strTryDouble);
                        JOptionPane.showMessageDialog(null, "Correct.");
                        break;

                    case 4:
                        done = true;
                        JOptionPane.showMessageDialog(null, "The program will now close.");
                        break;

                    default:
                        throw new NumberFormatException();
                }
            }
            catch(NumberFormatException e)
            {
                JOptionPane.showMessageDialog(null,"Please enter a 1, 2, 3, or 4.","Error",JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }
}
4

2 回答 2

1
  • strTryDouble在声明中是大写的 ( StrTryDouble)。
  • 输入和解析有点不清楚。

以下对我有用(JDK 6;更改了标记的行/***/):

import java.io.*;
import javax.swing.JOptionPane;

public class MyType
{
    public static void main(String[] args)
    {
        // declare class variables
        String strChoice, strTryString, strTryInt, strTryDouble; /***/
        int choice, tryInt;
        double tryDouble;
        boolean done = false;
        boolean ok; /***/

        // loop while not done
        while(!done)
        {
            try
            {
                strChoice = JOptionPane.showInputDialog(null, "What's my type\n\n\n1) String\n2) integer\n3) double\n4) Quit the program");

                choice = Integer.parseInt(strChoice); /***/

                switch(choice)
                {
                    case 1:
                        JOptionPane.showMessageDialog(null, "Correct, any input can be saved as a String.");
                        break;

                    case 2:
                        strTryInt = JOptionPane.showInputDialog(null,"Enter an integer"); /***/
                        ok = true;
                        try { /***/
                          tryInt = Integer.parseInt(strTryInt);
                        } catch(NumberFormatException e) { /***/
                          ok = false;     /***/
                        }
                        JOptionPane.showMessageDialog(null, ok?"Correct.":"Not an integer"); /***/
                        break;

                    case 3:
                        strTryDouble = JOptionPane.showInputDialog(null,"Enter a double"); /***/
                        tryDouble = Double.parseDouble(strTryDouble);
                        JOptionPane.showMessageDialog(null, "Correct.");
                        break;

                    case 4:
                        done = true;
                        JOptionPane.showMessageDialog(null, "The program will now close.");
                        break;

                    default:
                        throw new NumberFormatException();
                }
            }
            catch(NumberFormatException e)
            {
                JOptionPane.showMessageDialog(null,"Please enter a 1, 2, 3, or 4.","Error",JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }
}

为了获得类型的选择,JOptionPane.showInputDialog从用户那里返回字符串,然后Integer.parseInt解析它。

要获取值,您使用相同的模式:获取一个字符串,然后解析它。获取每个字符串中的字符串case会处理未初始化的变量。

在案例 2 中,我添加了一个示例,说明如何检查它是否实际上是一个整数,然后继续执行代码。通常,您可以捕获异常并设置一个标志 ( ok) 以进行处理。我只在异常是函数如何报告正常情况(例如,错误的用户输入)时才使用它;对于真正的错误,我让异常传播到更高级别的catch块。

于 2013-10-14T03:13:06.000 回答
1

这里有一个更有效、更完美的解决您的问题的方法:

import java.io.*;
import javax.swing.JOptionPane;

public class MyType
{
public static void main(String[] args)
{
    // declare class variables
    String strChoice=""; // you didn't need the other variables
    Integer choice, tryInt;
    double tryDouble;
    boolean done = false;

    // loop while not done
    while(!done)
    {
        try
        {
            strChoice = JOptionPane.showInputDialog(null, "What's my type\n\n\n1) String\n2) integer\n3) double\n4) Quit the program");

            if(strChoice.equals("")) // refuses blank answers, must enter a choice
            {
                JOptionPane.showMessageDialog(null,"Please enter a 1, 2, 3, or 4.","Error",JOptionPane.INFORMATION_MESSAGE);
                continue;
            }

            choice = Integer.parseInt(strChoice);
            if(choice !=4)  // so the input dialog doesn't appear when choice is 4
            strChoice = JOptionPane.showInputDialog(null,strChoice);




            switch(choice)
            {
                case 1:
                    JOptionPane.showMessageDialog(null, "Correct, any input can be saved as a String.");
                    break;

                case 2:
                    tryInt = Integer.parseInt(strChoice);
                    JOptionPane.showMessageDialog(null, "Correct.");
                    break;

                case 3:
                    tryDouble = Double.parseDouble(strChoice);
                    JOptionPane.showMessageDialog(null, "Correct.");
                    break;

                case 4:
                    done = true;
                    JOptionPane.showMessageDialog(null, "The program will now close.");
                    break;

                default:
                {   if((choice > 4) || (choice == null)) // must be 1 - 4, & not blank
                    JOptionPane.showMessageDialog(null,"Please enter a 1, 2, 3, or 4.","Error",JOptionPane.INFORMATION_MESSAGE);

                }
            }
        }
        catch(NumberFormatException e) // this should ONLY occur when type is wrong
        {
            JOptionPane.showMessageDialog(null,"Your input can't be stored into that type.","Error",JOptionPane.INFORMATION_MESSAGE);
        }
    }
}
}

此外,在这种情况下,您应该解析strChoice,而不是choice. choiceis 之前已经转换为 int,所以这不是一个很好的比较。使用strString真正将用户输入与类型进行比较。

我也改为int,Integerint一种原始数据类型,无法检查null值。Integer可以做所有可以做的事情int,但它是一个对象,并且对象可以为空。如果碰巧有选择,null我们可以检查它并做一些事情。

虽然您接受的答案没有错,但代码过于重复(不是一个好的编程习惯),并且与您的原始代码有很大的不同。当“错误”消息与真正错误的描述不符时,也会出现例外情况。此外,程序变得更加复杂:在编程中越简单越好。

希望这可以帮助!如果您有任何问题,请告诉我!

干杯! :)

仲量联行

于 2013-10-14T04:04:29.417 回答