Java 当有人在变量上键入错误信息时,如何避免错误?

Java 当有人在变量上键入错误信息时,如何避免错误?,java,variables,Java,Variables,我是新来的,所以如果我的问题有什么错误或者在错误的部分,请原谅。我现在正在练习Java,我想知道怎么做。代码如下: package train; import java.util.Scanner; public class Train { public static double sum(double n1, double n2){ double sum = n1 + n2; return sum; } public static double subtraction(

我是新来的,所以如果我的问题有什么错误或者在错误的部分,请原谅。我现在正在练习Java,我想知道怎么做。代码如下:

package train;

import java.util.Scanner;

public class Train {

public static double sum(double n1, double n2){
    double sum = n1 + n2;

    return sum;
}

public static double subtraction(double n1, double n2){
    double subtraction = n1 - n2;

    return subtraction;
}

public static double mult(double n1, double n2){
    double mult = n1 * n2;

    return mult;
}

public static double div(double n1, double n2){
    double div = n1 / n2;

    return div;
}

public static void main(String[] args) {

    int choice;
    boolean stay = true;
    double val1, val2;
    Scanner sc = new Scanner(System.in);

    while (stay = true){
        System.out.println("Selecione a operação desejada.");
        System.out.println("1 - Adição, 2 - Subtração, 3 - Multiplicação, 4 - Divisão; Pressione 0 para sair.");
        choice = sc.nextInt();

        switch(choice){
            case 1:
                System.out.println("Digite dois valores a serem somados: ");
                val1 = sc.nextDouble();
                val2 = sc.nextDouble();

                double valsum = sum(val1, val2);

                System.out.printf("A soma desses dois valores é %f. ", valsum);
            break;

            case 2:
                System.out.println("Digite dois valores a serem subtraídos: ");
                val1 = sc.nextDouble();
                val2 = sc.nextDouble();

                double valsubtraction = subtraction(val1, val2);

                System.out.printf("A subtração desses dois valores é %f. ", valsubtraction);
            break;

            case 3:
                System.out.println("Digite dois valores a serem multiplicados: ");
                val1 = sc.nextDouble();
                val2 = sc.nextDouble();

                double valmult = mult(val1, val2);

                System.out.printf("A multiplicação desses dois valores é %f. ", valmult);
            break;

            case 4:
                System.out.println("Digite dois valores a serem divididos: ");
                val1 = sc.nextDouble();
                val2 = sc.nextDouble();

                double valdiv = div(val1, val2);

                System.out.printf("A divisão desses dois valores é %f. ", valdiv);
            break;

            case 0:
                System.exit(0);
            break;

            default:
                System.out.println("Esta não é uma operação válida.");
            break;
        }
    }
}

}
当用户在任何变量上键入“已接受”信息以外的信息时(如在“双精度”变量上键入文本),程序将给出错误。有可能避免吗


如果是这样,我该怎么做?

您可以捕获错误,然后重新启动while循环,并向用户发出新的提示

类扫描程序在不读取int时很可能引发一些异常。首先,您可以

        try{
            choice = sc.nextInt();
        }
        catch(InputMismatchException e){
            choice=-1;
            e.printStackTrace();
        }

并尝试使用调试器跟踪程序执行。

只是一个简单的示例。如果用户输入了不匹配的输入类型值。变量将获得负值。这是-1

    Scanner input = new Scanner(System.in);
    system.out.println("Enter a double number: ");
    double number;
    while (number <=0){

       try{
           number = input.nextDouble();
       }
       catch(InputMismatchException ex){
            System.out.println("Please Enter a valid number");
        }
       input.nextLine(); // clears the buffer


    }
扫描仪输入=新扫描仪(System.in);
system.out.println(“输入一个双精度数字:”);
双数;

while(number通常应该使用has*方法之一进行检查。奇怪的是,每个人都想捕获异常

      while (!sc.hasNextDouble()) {
          System.out.println("Bonvolu tajpi nombron");
          sc.next(); // Discard the rubbish.
      }
      val1 = sc.nextDouble();

      while (!sc.hasNextDouble()) {
          System.out.println("Bonvolu tajpi nombron");
          sc.next(); // Discard the rubbish.
      }
      val2 = sc.nextDouble();
虽然没有“已扫描下一个双精度”标记,但请继续读取非特定的“下一个”标记

可以使用函数来防止代码复制

private static double scanDouble(Scanner sc, String errorMessage) {
    while (!sc.hasNextDouble()) {
        System.out.println(errorMessage);
        sc.next(); // Discard the rubbish.
    }
    return sc.nextDouble();
}

java.util.Scanner类的文档是这个问题的一个很好的起点:

当查看其中的方法时,您会发现Scanner支持一系列用于测试输入令牌数据类型的方法,这些方法是hasNextXXXX()方法(hasNextFloat()、hasNextDouble()等)。使用这些方法,您可以对用户提供的输入执行条件检查,并使用这些检查确定是使用和操作提供的值,还是通知用户输入无效。一个简单的示例:

package inputtest;

public class InputTest {

    public static void main(String[] args) {

        java.util.Scanner scanner = new java.util.Scanner(System.in);

        System.out.print("Please enter an integer value: ");

        while(scanner.hasNext()) { 
            if (scanner.hasNextInt()) {
                int x = scanner.nextInt();
                System.out.println("Thanks for the integer; you provided: " + x);
            } else {
                System.out.println("Sorry, you did not provide and integer value.");
                break;
            }
        }

    }

}

显然,您可以选择重新提示输入,而不是在此处中断,但方法是相同的。

您可以用当前代码捕获
inputmaschException
,或者将输入解析为
String
,并从中解析数据,如果您想要更大的灵活性。您需要将异常类型缩小为
input不匹配异常
,这样您就不会捕获到不想捕获的内容