【问题标题】:Repeat a method from "if" until a proper value to be returned is entered从 "if" 重复一个方法,直到输入要返回的正确值
【发布时间】:2015-12-21 13:52:54
【问题描述】:

当我在工作中无事可做时,我正在尝试学习 Java 的基础知识,并且想玩弄输入法。这就是我现在拥有的:

import java.util.Scanner;
public class Input {
    private static Scanner input;
    public static void main(String [] args){
        String name = (askName());
        double age = (askAge());
        System.out.println("Your name is " + name + " and your age is " + age);
    }
static String askName(){
    System.out.print("What is your name?");
    input = new Scanner(System.in);
    //listens for strings
    String name = input.next();
    return name;
}
static double askAge(){
    System.out.print("What is your age?");
    input = new Scanner(System.in);
    //listens for doubles
    double age = input.nextDouble();
    if (input.hasNextDouble()){
        return age;
    } else {
        System.out.println("Please insert a number:");
        askAge();}
}
}

这就是我得到的:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    This method must return a result of type double

    at Input.askAge(Input.java:16)
    at Input.main(Input.java:6)

我该怎么做才能强制用户输入一个整数(也就是说,我如何让该方法不断重复,直到它得到一个可以返回的 int?)

【问题讨论】:

  • 仅供参考,您要查找的单词是recursion
  • 你的逻辑倒退了:先检查hasNextDouble,如果hasNextDouble为真,再调用nextDouble

标签: java return java.util.scanner


【解决方案1】:

返回递归调用的值:

System.out.println("Please insert a number:");
return askAge();

但是:这里最好使用循环而不是递归,因为如果继续输入无效值,您(最终)可能会得到 StackOverflowError

【讨论】:

    【解决方案2】:

    If 条件用于决策而不是循环。 使用while循环,当你得到正确的值时打破循环。 我正在连接一个 sudo 代码。

    while(true){
    if (input.hasNextDouble()){
            //Assign value to a variable ;
            //Break loop
        } else {
            //Re ask question 
            System.out.println("Please insert a number:");
           }
    
    }
    

    示例link 为您提供帮助。

    你得到的例外是因为你没有从 else 部分的 askAge() 返回任何值。

    【讨论】:

    • 好的,所以我设法获得了要求我输入双倍的方法,直到我输入一个,但如果我第一次被问到时不这样做,它不会返回主要方法。我现在做错了什么?请不要开枪,我只是一个被 IT 人员包围的语言学家;)
    【解决方案3】:

    我宁愿这样做:

    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        String name = getString(sc, "What is your name? ");
        int age = getInt(sc, "What is your age? ");
        System.out.println("Your name is " + name + " and your age is " + age);
    }
    
    
    /* You increase the performance when using an already existing single      
    scanner multiple times for different reasons (to get a name, first name, 
    second name, age, etc.), instead of making a new Scanner each time */
    
    public static String getString(Scanner sc, String message) {
        System.out.print(message);
        return sc.nextLine();
    }
    
    public static int getInt(Scanner sc, String message) {
        System.out.print(message);
        if (sc.hasNextInt()) {
            return sc.nextInt();
        } else {
            sc.next(); // required to skip the current input
            return getInt(sc, "Please insert a number: ");
        }
    }
    

    【讨论】:

    • 好吧,这行得通。我还不明白为什么,但他们不让我接触任何源代码是有原因的;)
    【解决方案4】:

    请更改您的方法,例如,

       static double askAge(){
        System.out.print("What is your age?");
        input = new Scanner(System.in);
        //listens for doubles
    
        if (input.hasNextDouble()){
            return input.nextDouble();
        } else {
            System.out.println("Please insert a number:");
           }
        return  askAge();
    }}
    

    【讨论】:

    • 这并不能解决问题中描述的编译问题。
    • good catch @AndyTurner ,更新了我的代码。这段代码运行良好。经过测试
    猜你喜欢
    • 2016-11-19
    • 2018-08-27
    • 2011-07-17
    • 2013-11-23
    • 1970-01-01
    • 2014-08-31
    • 2018-09-21
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多