当某人在变量上键入错误的信息时,如何避免错误



我是新来的,所以如果我的问题上有任何错误,或者在错误的部分中,我会原谅我。我现在正在练习爪哇,我想知道该怎么做。这是代码:

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;
        }
    }
}
}

当用户在任何一个变量上键入"接受"信息以外的其他内容(例如在'double'变量上键入文本)时,该程序会出现错误。可以避免吗?

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

您可以使用尝试捕获语句来捕获错误,然后用新的提示重新启动您的WARE循环。

类扫描仪很可能是在不读取int时会引发一些例外。首先,您可以

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

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

通常应使用其中一种方法来检查。奇怪的是,每个人都想捕捉例外。

      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类的文档是一个开始的好地方:

https://docs.oracle.com/javase/8/docs/api/java/java/util/scanner.html

在查看其中的方法时,您会发现扫描仪支持一系列测试输入令牌数据类型的方法,即Hasnextxxxx()方法(HasnextFloat(),HasnextDuble()等)。使用这些方法,您可以对用户提供的输入进行有条件检查,并使用这些检查来确定是否消耗和操作提供的值,或者通知用户输入无效。一个琐碎的例子:

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;
            }
        }
    }
}

显然,您可以选择重新提交输入,而不是在此处突破,但是这些方法是相同的。

只是简单的示例。如果用户输入不匹配的输入类型值。该变量将获得负值。是-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

    }

相关内容

最新更新