我正在获得资源泄漏

时间:2013-11-21 16:13:47

标签: resources memory-leaks

每当我运行此代码时,它运行得非常顺利,直到while循环运行一次。它将返回并再次询问名称,然后跳过String b = sc.nextLine();,然后打印下一行。

static Scanner sc = new Scanner(System.in);

static public void main(String [] argv) {
    Name();
}

static public void Name() {

boolean again = false;
do
{
    System.out.println("What is your name?");

    String b = sc.nextLine();
    System.out.println("Ah, so your name is " + b +"?\n" +
            "(y//n)");
    int a = getYN();
    System.out.println(a + "! Good.");
    again = askQuestion();
} while(again);



}

static public boolean askQuestion() {
    System.out.println("Do you want to try again?");
    int answer = sc.nextInt();

    if (answer == 1) {
        return true;
    }
    else {
        return false;
    }

}

static int getYN() {
    switch (sc.nextLine().substring(0, 1).toLowerCase()) {
    case "y":
        return 1;
    case "n":
        return 0;
    default:
        return 2;
    }
}

}

另外,我正试图创建这个程序,我可以问三个问题(比如某人的姓名,性别和年龄,可能更像是种族和诸如此类的东西),然后将所有这些答案都带回来。就像在最后说的那样,“那么,你的名字是+名字+,你是+性别+,你是+年龄+岁?是/否。”沿着那条线的东西。我知道有办法做到这一点,但我不知道如何在任何地方保存这些响应,我不能抓住它们,因为它们只出现在方法的实例中。

1 个答案:

答案 0 :(得分:0)

使用nextInt()和相同的扫描仪后,不要尝试使用nextLine()扫描文本!它可能会导致问题。打开扫描仪方法仅限整数...建议使用。 您总是可以解析扫描仪的String答案。

此外,以这种方式使用扫描仪不是一个好习惯,您可以在数组中组织问题,为这样一个独特的扫描程序实例选择一个循环读取:

public class a {

    private static String InputName; 
    private static String Sex; 
    private static String Age; 
    private static String input; 
    static Scanner sc  ; 

    static public void main(String [] argv) {
        Name();
    } 

    static public void Name() {

      sc =  new Scanner(System.in);

       String[] questions = {"Name?","Age","Sex?"};//
       int a = 0; 
       System.out.println(questions[a]); 

      while (sc.hasNext()) {
          input = sc.next();
           setVariable(a, input);
            if(input.equalsIgnoreCase("no")){
                sc.close();
                break;
            }
            else if(a>questions.length -1)
            {
                a = 0;
            }
            else{
                a++;
            }
            if(a>questions.length -1){
                System.out.println("Fine " + InputName 
                        + " so you are " + Age + " years old and " + Sex + "." );
                Age = null;
                Sex = null;
                InputName = null;
                 System.out.println("Loop again?"); 

              }
               if(!input.equalsIgnoreCase("no") && a<questions.length){
              System.out.println(questions[a]);
              } 
        } 

    }


    static void setVariable(int a, String Field) {
        switch (a) {
        case 0:
            InputName = Field;
            return;
        case 1:
            Age = Field;
            return;
        case 2:
            Sex = Field; 
            return;
        }
    }
}

注意全局变量,保存你的信息,直到你将它们设置为空或空......你可以将它们用于最终的肯定。

希望这有帮助! 希望这有帮助!