在Java中使用方法时循环问题

时间:2010-08-07 08:42:11

标签: java methods

我正在做一个关于方法的简单程序。 但我有一个问题。除了循环时,一切都已经有效了。 当我选择再循环。程序跳过输入名称。并直接进入年份和部分。 这是代码:

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;

    }

我真的很烦恼这个问题,我对如何解决这个问题一无所知。请帮忙。感谢

3 个答案:

答案 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));