我正在做一个关于方法的简单程序。 但我有一个问题。除了循环时,一切都已经有效了。 当我选择再循环。程序跳过输入名称。并直接进入年份和部分。 这是代码:
public static void main(String[] args) {
do{
System.out.println("Input info:");
name=stringGetter("Name: ");
yearandsec=stringGetter("Year and section: ");
sex_code=charGetter("Sex code: " + "\n" + "[M]" + "\n" + "[F]:");
scode=intGetter("Scholarship code: ");
ccode=intGetter("Course code: ");
units=intGetter("Units: ");
fee_per_unit=doubleGetter("Fee per unit: ");
misc=doubleGetter("Miscellaneous: ");
display();
switches(scode, units, fee_per_unit, misc);
System.out.println("Another?");
dec=rew.nextInt();
}while(dec==1);
}
以下是获取name值以及年份和部分的方法:
public static String stringGetter(String ny){
String sget;
System.out.println(ny);
sget=rew.nextLine();
return sget;
}
我真的很烦恼这个问题,我对如何解决这个问题一无所知。请帮忙。感谢
答案 0 :(得分:2)
这是一个更简单,更完整的程序,可以重现错误:
public static Scanner rew = new Scanner(System.in);
public static void main(String[] args) {
int dec;
do {
System.out.println("Input info:");
String name=stringGetter("Name: ");
String yearandsec=stringGetter("Year and section: ");
dec=rew.nextInt();
} while(dec==1);
}
public static String stringGetter(String ny){
System.out.println(ny);
return rew.nextLine();
}
问题是,在调用nextInt()
后,对nextLine()
的调用将读取int之后的新行(给出一个空行),而不是 next 新行。
如果您将dec更改为字符串并将dec=rew.nextInt();
更改为dec=rew.nextLine();
,那么它将正常工作。这是一个完整的示例,您可以将其复制并粘贴到空白文件中,以确保其正常工作:
import java.util.*;
public class Program
{
public static Scanner rew = new Scanner(System.in);
public static void main(String[] args) {
String dec;
do {
System.out.println("Input info:");
String name = stringGetter("Name: ");
String yearandsec = stringGetter("Year and section: ");
dec = stringGetter("Enter 1 to continue: ");
} while(dec.equals("1"));
}
public static String stringGetter(String ny){
System.out.println(ny);
return rew.nextLine();
}
}
您可能还需要考虑为您的程序添加正确的解析和验证。目前,如果用户输入无效数据,您的程序将以不受欢迎的方式运行。
答案 1 :(得分:1)
嗯,你没有告诉我们什么是“重写”,也没有告诉我们rew.nextInt()
的作用。 rew.nextInt()
是否有可能等待用户点击返回,但实际上只消耗了输入的一个字符 - 以便下一次调用rew.nextLine()
(对于名称)只需立即执行其余操作那条线?我怀疑这是因为你正在使用System.in
而发生的事情 - 通常从System.in
读取只会在你返回时给出任何输入。
(这可能是也只是Windows上的一个问题 - 我想知道它是否从System.in中使用“\ r”作为分隔符,而“\ n”仍留在缓冲区中不确定。)
为了测试这一点,当你被问到是否要继续时,尝试输入“1 Jon” - 我认为它会使用“Jon”作为下一个名字。
从本质上讲,我认为使用Scanner.nextInt()
会在下一次调用Scanner.nextString()
时出现问题。您可能最好使用BufferedReader
并反复调用readLine()
,然后自行解析数据。
答案 2 :(得分:1)
该行:
dec = rew.nextInt();
从输入流中读取一个int值并且没有处理换行符,然后当你回到你得到名字的位置时,一个新行仍在Reader的缓冲区中并被stringGetter使用为name返回一个空值。
更改行以执行以下操作:
do {
//....
s = stringGetter("Another (y/n)? ");
} while ("y".equals(s));