尝试抓住do while循环

时间:2017-07-27 11:02:06

标签: java exception-handling try-catch do-while

程序要求输入double num 1和double num 2的用户输入 如果有异常,我希望它再次询问num 1和num 2的输入

public static void main (String[] args) {
    Scanner sc = new Scanner(System.in);
    double num1, num2;
    int error = 0;
    int text;
    System.out.print("Enter 4 ");
        text = sc.nextInt();

    do{

        try{

    if(text == 4){
            System.out.print("Enter number 1: ");
            num1 = sc.nextDouble();
            System.out.print("Enter number 2: ");
            num2 = sc.nextDouble();
            double quotient = num1/num2;
            System.out.println("The Quotient of "+num1 + "/" +num2+ " = "+quotient);
            }
        }catch(Exception ex){ 
            System.out.println("You've entered wrong input");
                error = 1;
        }                                  

          }while(error == 1);
}

然后当我尝试代码时,如果它会通过在num1或num 2中输入字符串来捕获异常,那么我有这个无限循环:  Enter number 1: You've entered wrong input Enter number 1: You've entered wrong input Enter number 1: You've entered wrong input Enter number 1: You've entered wrong input Enter number 1: You've entered wrong input

8 个答案:

答案 0 :(得分:3)

您需要重置循环内的error变量

do {
    error = 0;
    //...
} while(error == 1);

答案 1 :(得分:1)

它在C#中但相对类似:)

public class Program
{
  private static double ReadUserInput (string message) 
  {
    // This is a double
    // The '?' makes it nullable which is easier to work with
    double? input = null;

    do 
    {
      // Write message out
      Console.Write(message);
      // Read answer
      var inputString = Console.ReadLine();
      // Temp variable for the number
      double outputNumber = 0;
      // Try parse the number
      if (double.TryParse(inputString, out outputNumber))
      {
        // The number was parsable as a double so lets set the input variable
        input = outputNumber;
      }
      else
      {
        // Tell the user the number was invalid
        Console.WriteLine("Sorry bud, but '" + inputString + "' is not a valid double");
      }
    } 
    while (input == null); // Keep running until the input variable is actually set by the above

    // Return the output
    return (double)input;
  }

  public static void Main()
  {
    // Read a number
    var num1 = ReadUserInput("Enter number 1:");
    // Read another number
    var num2 = ReadUserInput("Enter number 2:");
    // Show the calculation
    Console.WriteLine("Answer: " + (num1*num2));
  }
}

Demo

对于实际代码(在JAVA中):

public class JavaFiddle 
{
  public static void main (String[] args) 
  {
    // Read a number
    Double num1 = ReadUserInput("Enter number 1:");
    // Read another number
    Double num2 = ReadUserInput("Enter number 2:");
    // Show the calculation
    System.out.println("Answer: " + (num1*num2));
  }

  public static Double ReadUserInput (String message) 
  {
    java.util.Scanner inputScanner = new java.util.Scanner(System.in);
    Double input = null;

    do 
    {
      // Write message out
      System.out.println(message);
      // Read answer
      String inputString = inputScanner.nextLine();
      try 
      {
        // Try parse the number
        input = Double.parseDouble(inputString);
      } 
      catch (NumberFormatException e) 
      {
        // Tell the user the number was invalid
        System.out.println("Sorry bud, but '" + inputString + "' is not a valid double");
      }
    } 
    while (input == null); // Keep running until the input variable is actually set by the above

    // Return the output
    return input;
  }
}

答案 2 :(得分:1)

没有必要使用异常处理。只需使用Scanner.hasNextDouble()方法查明实际用户输入是否为double,否则继续循环。

package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double num1, num2;
        num1 = readDouble(1, sc);
        num2 = readDouble(2, sc);
        double quotient = num1/num2;
        System.out.println("The Quotient of " + num1 + "/" + num2 + " = " + quotient);
    }

    private static double readDouble(int i, Scanner sc) {
        while (true) {
            System.out.print("Enter number " + i + ": ");
            if (!sc.hasNextDouble()) {
                System.out.println("You've entered wrong input");
                sc.next();
                continue;
            }
            break;
        }
        return sc.nextDouble();
    }
}

答案 3 :(得分:0)

您可能想测试是否没有错误:

}while(error != 1);

}while(error == 0);

答案 4 :(得分:0)

如果输入无效,您将需要一个调用自身的输入方法。

double getInput(Scanner sc) {
    try {
        double num = sc.nextDouble();
        return num;
    } catch(Exception ex) { 
        System.out.println("You've entered wrong input");
        return getInput(sc);
    }    
}

并在您的其他方法中调用此方法两次。

答案 5 :(得分:0)

它可能看起来很难看,但这是一种方法

  do
  {
    if(...)
    {

      boolean successReading = false;
      while(!successReading)
      {
        try
        {
          System.out.print("Enter number 1: ");
          num1 = sc.nextDouble();
          System.out.print("Enter number 2: ");
          num2 = sc.nextDouble();

          successReading = true;

          double product = num1*num2;
        }
        catch(Exception e)
        {
          successReading = false;  
        }
      }

    }
  }while(...)

答案 6 :(得分:0)

您需要在sc.next();阻止内添加catch

在异常的情况下,

nextDouble方法不清除缓冲区。因此,下次调用它时会出现相同的错误,因为旧输入仍在缓冲区中。

您还需要在循环开始时重置error标志。

答案 7 :(得分:0)

您必须将sc.next();放入陷阱中,这样才能清除扫描仪变量并要求输入