Java:使用Try / Catch Exception检查用户输入是否为Double

时间:2017-02-28 21:27:20

标签: java exception input double try-catch

我正在编写一个简单的程序,允许用户为英尺和英寸测量输入两个单独的双打。该程序旨在获取这些值并将它们转换为厘米并输出它们。另外我要包括两个例外:一个是确保数值是正数而不是负数(这个我已经完成)和另一个例外,以确保输入的输入是一个double值而不是一个字符串值(这个我有一个很难过)。因此,如果用户输入输入...例如'比尔'而不是数字,它是显示错误消息并要求用户再次重新输入输入值。

似乎我最好将用户输入收集为一个字符串(而不是像我现在的那样加倍),我转换为双精度并将它们作为双精度返回到相应的方法:getFootValue()和getInchValue( ) - 但我不太确定。

我应该如何通过自定义异常来实现这一点?我不能简单地利用InputMismatchException,我需要创建自己的标题NonDigitNumberException()。

这是我到目前为止所拥有的......

import java.util.Scanner; 

public class Converter 
{
    private double feet;
    private double inches;

    public Converter(double feet, double inches) 
    {
        this.feet = feet;
        this.inches = inches;

    }

    public double getFootValue() 
    {
            return feet;
    }

    public double getInchValue()
    {
        return inches; 
    }

    public double convertToCentimeters()
    {
        double inchTotal;

        inchTotal = (getFootValue() * 12) + getInchValue();

        return inchTotal * 2.54;
    }

    public String toString() 
    {
        return ("Your result is: " + convertToCentimeters());
    }
}


import java.util.Scanner; 
import java.util.InputMismatchException;

public class TestConverter
{
    public static void main(String[] args) 
    {
        /* Create new scanner for user input */
        Scanner keyboard = new Scanner(System.in);

        do
        {
            try
            {
                /* Get the feet value */
            System.out.print("Enter the foot value: ");
                double feet = keyboard.nextDouble();
            if (feet < 0) throw new NegativeNumberException();

            /* Get the inches value */
            System.out.print("Enter the inch value: ");
                double inches = keyboard.nextDouble();  
            if (inches < 0) throw new NegativeNumberException();    

            else
            {
                 Converter conversion = new Converter(feet, inches);    

                /* Print the converted result */
                System.out.println(conversion);
                break;
            }
            } catch(InputMismatchException ignore){}
            catch(NegativeNumberException error)
            {
                System.out.println("A negative-numeric value was entered, please enter only positive-numeric values...");
            }

        }while(true);

        /* Close the keyboard */
         keyboard.close();

    }
}

class NegativeNumberException extends Exception 
{
    public NegativeNumberException() 
    {
        super();
    }
    public NegativeNumberException(String errorMessage) 
    {
        super(errorMessage);
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

你过度复杂化了。您只需使用Scanner.hasNextDouble()方法。

示例:

假设此代码位于main方法中。

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("enter value");
    double myValue = 0;
    if(scanner.hasNextDouble()){
      myValue = scanner.nextDouble();
    }else{
      System.out.println("Wrong value entered");
    }
  }
}

然后,您可以继续使用myValueConverter

<强>更新

根据您在评论中告诉我的内容,您似乎必须创建自己的exception class。所以,我决定为你实现这一点,希望你能够从这里开始。

自定义异常类

public class NonDigitNumberException extends InputMismatchException {
    public NonDigitNumberException(String message){ // you can pass in your own message
        super(message);
    }

    public NonDigitNumberException(){ // or use the default message
        super("input is not a digit");
    }
}

负数例外例

public class NegativeNumberException extends IllegalArgumentException {
    public NegativeNumberException(String message){ // you can pass in your own message
        super(message);
    }

    public NegativeNumberException(){ // or use the default message
        super("negative number is not valid");
    }
}

验证方法

public static double inputValidator(){
  Scanner scanner = new Scanner(System.in);
  System.out.println("enter a value"); // prompt user for input
  String getData = scanner.next(); // get input
  if(getData.length() >= 1){
        if(!Character.isDigit(getData.charAt(0)) && getData.charAt(0) != '-') throw new NonDigitNumberException();
  }
  for (int i = 1; i < getData.length(); i++) {
     if(!Character.isDigit(getData.charAt(i))) throw new NonDigitNumberException();
  }
  return Double.parseDouble(getData); // at this point the input data is correct
}

负数验证器

public static boolean isNegative(double value){
   if(value < 0) throw new NegativeNumberException();
   return false;
}

主要方法

 public static void main(String[] args) {
   try {
     double myValue = inputValidator();
     System.out.println(isNegative(myValue)); // check if number is negative
   }catch (NegativeNumberException e){
     e.printStackTrace();
   }
   catch (NonDigitNumberException e){
     e.printStackTrace();
   }
   catch(Exception e){
     e.printStackTrace();
   }
 }

答案 1 :(得分:0)

您真的需要自定义例外吗?因为如果输入不是双倍,keyboard.nextDouble()已经抛出InputMismatchException

您应该显示错误消息(说用户没有输入数字),而不是忽略异常。

答案 2 :(得分:0)

我猜,你是在混淆:

如果是双重输入,则必须首先验证用户的输入。如果不是,那么您将获得InputMismatchException。

然后你必须验证输入,如果它对你的转换器有效(它是肯定的吗?)。在这里你可以抛出你的自定义异常。

然后你调用你的转换器,它也可能抛出你的自定义异常。

所以我的解决方案是:

import java.util.Scanner;
import java.util.InputMismatchException;

public class TestConverter {
    public static void main(String[] args) {
        /* Create new scanner for user input */
        Scanner keyboard = new Scanner(System.in);

        do {
            double feet = -1, inches = -1;
            Exception exception;
            do {
                exception = null;
                /* Get the feet value */
                System.out.print("Enter the foot value (positive-numeric): ");
                try {
                    feet = keyboard.nextDouble();
                } catch (InputMismatchException e) {
                    keyboard.next();
                    exception = e;
                }
            } while (exception != null);
            do {
                exception = null;
                /* Get the inches value */
                System.out.print("Enter the inch value (positive-numeric): ");
                try {
                    inches = keyboard.nextDouble();
                } catch (InputMismatchException e) {
                    keyboard.next();
                    exception = e;
                }
            } while (exception != null);


            try {
                if (feet < 0) throw new NegativeNumberException();
                if (inches < 0) throw new NegativeNumberException();

                Converter conversion = new Converter(feet, inches);

                /* Print the converted result */
                System.out.println(conversion);
                break;
            }
            catch(NegativeNumberException error) {
                System.out.println("A negative-numeric value was entered, please enter only positive-numeric values...");
            }
        } while (true);

        /* Close the keyboard */
        keyboard.close();

    }
}

<强>输出

Enter the foot value (positive-numeric): test
Enter the foot value (positive-numeric): 1234
Enter the inch value (positive-numeric): test
Enter the inch value (positive-numeric): 1234
Your result is: 40746.68