我的程序无法正常工作。
代码的目的:询问用户名,性别,年龄 - 如果年龄超过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)
答案 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)
现在你没有合适的制定者,添加一个并看看它是否有效。