程序在扫描仪输入对象可以执行之前结束

时间:2015-08-11 17:30:44

标签: java if-statement java.util.scanner

我的程序无法正常工作。

代码的目的:询问用户名,性别,年龄 - 如果年龄超过18岁,询问用户是否结婚。如果用户说是,请在已经给出的名字前输出先生或夫人。

我正在练习嵌套的if语句和getter / setter方法来返回私有变量。

我试过:嵌套测试性别和年龄状态的if语句,然后我尝试使用switch语句而不是if语句来测试婚姻状态,然后我尝试在switch中嵌套if语句来测试性别和年龄。我试过给每个if,else if子句他们自己的扫描器输入认为只是让它运行,但它没有。

我最初将婚姻状况作为一个getter / setter方法,但是把它拿出去简化问题。

我已经找到了答案,但似乎代码是正确的,它只是不会接受输入!

我的代码如下:

package agemessage;

import java.util.Scanner;

public class AgeMessage {

    public static void main(String[] args) {
        info infoObject = new info(); //setter getter class to house input from user
        Scanner in = new Scanner(System.in);

        System.out.println("what is your name again?");
        String input = in.nextLine();
        infoObject.getName(input);

        System.out.println("thanks, " + infoObject.setName() + " is that a boys name or a girls name?");
        String gender = in.nextLine();
        infoObject.getGender(gender);

        System.out.println("How old are you " + infoObject.setName() + "?");
        int ageInput = in.nextInt();
        //infoObject.getAge(ageInput);

        if (ageInput < 18) {
            System.out.print("I shall just call you " + infoObject.setName() + ".");
            System.exit(0);

        } else if (ageInput >= 18) {
            System.out.println("Are you married yet?");
        }

        //PROGRAM STOPS HERE -- DOES NOT EXECUTE INPUT 
        String status = in.nextLine();

        if (status.equalsIgnoreCase("Y") && infoObject.setGender().equalsIgnoreCase("Girl")) {
            System.out.println("I will have to call you Mrs. " + infoObject.setName() + ".");

        } else if (status.equalsIgnoreCase("Y") && infoObject.setGender().equalsIgnoreCase("Boy")) {
            System.out.println("I will have to call you Mr. " + infoObject.setName() + ".");
            System.exit(0);

        } else if (status.equalsIgnoreCase("N")) {
            System.out.println("I will just call you " + infoObject.setName() + ".");
        }

    }// main end

}//class end

输出:

run:
what is your name again?
Carrie Ann Moss
thanks, Carrie Ann Moss is that a boy's name or a girls name?
girl
How old are you Carrie Ann Moss?
40
Are you married yet?
BUILD SUCCESSFUL (total time: 16 seconds)

3 个答案:

答案 0 :(得分:0)

请尝试在in.nextLine();

之后加int ageInput = in.nextInt();

通过这种方式,扫描仪不会忽略整数后的下一行。

可能的重复是Using scanner.nextLine()

答案 1 :(得分:0)

在解决问题之前,有一些事情需要解决。

Code conventions.这些可以帮助其他人阅读您的代码。不是必需的,但确实有帮助。

Getters和setter:getter获取对象。 setter设置对象。你反过来使用它们。示例如下。

class Person{
    int age;

    public void setAge(int a){
        age = a;
    }

    public int getAge(){
        return age;
    }
}

所以在一个程序中,假设我们有一个名为annie的Person对象,他22岁。

Person annie = new Person();
annie.setAge(22);

在该计划的后期,我们想说她多大了......

System.out.println("Annie is " + annie.getAge() +" years old.");

getter获取名为annie的Person对象上的age变量的值。

现在针对程序中的实际问题,当调用nextInt时,它不会解析换行符。所以发生了什么:

int ageInput = in.nextInt();

在这里,当你输入“40”然后按Enter键时,你将给出这个程序:

"40\n"

nextInt只读取整数的末尾,因此它只读取40而不是换行符。

if (ageInput < 18) {
    System.out.print("I shall just call you " + infoObject.setName() + ".");
    System.exit(0);

} else if (ageInput >= 18) {
    System.out.println("Are you married yet?");
}

这是正常的,打印出“你结婚了吗?”串。 但是,它不会停止执行。

String status = in.nextLine();

这是问题所在。您的扫描仪对象,它没有超出以前的换行符。所以它立即接受了该行的其余部分,这就是:

"\n"

然后将String状态设置为“\ n”。

if (status.equalsIgnoreCase("Y") && infoObject.setGender().equalsIgnoreCase("Girl")) {
    System.out.println("I will have to call you Mrs. " + infoObject.setName() + ".");

} else if (status.equalsIgnoreCase("Y") && infoObject.setGender().equalsIgnoreCase("Boy")) {
    System.out.println("I will have to call you Mr. " + infoObject.setName() + ".");
    System.exit(0);

} else if (status.equalsIgnoreCase("N")) {
    System.out.println("I will just call you " + infoObject.setName() + ".");
}

由于status设置为“\ n”,因此不打印任何其他内容,并且到达main函数的末尾,终止程序。

要解决这个问题,请在in.nextInt()之后直接输入in.nextLine()。这会跳过该行的其余部分,允许您的程序继续进入之前跳过的部分。

答案 2 :(得分:-1)

现在你没有合适的制定者,添加一个并看看它是否有效。