正确登陆后(用户名 admin 密码:admin)
输入指令 start
提示输入用户姓名:
如果输入“stop”,且提问是否退出系统时选择"1[继续]" ,为什么之后会输出两行“请输入用户名:”?
是不是循环有问题?希望大家帮我看看,谢谢!
下面是源代码:
package com.baijw.test2;import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class NameSystem1 { private static List<String> names = new ArrayList<String>();
private static Scanner sc = new Scanner(System.in); public static void main(String[] args) {
System.out.println("欢迎登陆姓名管理系统");
login();
} public static void login() {
final String PASSWORD = "admin";
final String USERNAME = "admin";
System.out.println("请输入用户名和密码");
System.out.println("用户名:");
String username = sc.nextLine();
System.out.println("密码:");
String password = sc.nextLine();
if (username.equalsIgnoreCase(USERNAME)
&& password.equalsIgnoreCase(PASSWORD)) {
display();
} else {
System.out.println("您输入的用户名或密码错误,请重新登陆!");
login();
}
} public static void display() {
System.out.println("您已经登陆成功!");
System.out.println("请输入指令:");
String command = sc.nextLine();
if (command.equalsIgnoreCase("start")) {
start();
} else if (command.equalsIgnoreCase("stop")) {
stop();
} else {
errorCommand();
display();
}
} public static void stop() {

System.out.println("您确定要退出系统吗?");
System.out.println("0【退出】        1【继续】");
int stopFlag=sc.nextInt();
switch(stopFlag) {
case 0 : 
   {System.out.println("您已经退出系统!");
System.out.println("用户的姓名是:");
int i = 0;
for (String name : names) {
System.out.println("NAME" + i + ": " + name);
i++;
}
System.exit(0);
  }
case 1: {start();break;}

default :{errorCommand(); stop();break;}
}
} public static void start() {
while (true) {
String name = null;
System.out.println("请输入用户名:");
name = sc.nextLine();
if (name.equalsIgnoreCase("start")) {
System.out.println("此姓名无效,请重新输入!");
} else if (name.equalsIgnoreCase("stop")) {
stop();
return ;
} else {
names.add(name);
}
}
} public static void errorCommand() {
System.out.println("您输入错误指令,请重新输入!");
}
}

解决方案 »

  1.   

    int stopFlag=sc.nextInt(); 后加
    sc.nextLine();起回车换行作用
      

  2.   


    ublic static void stop() { System.out.println("您确定要退出系统吗?"); 
    System.out.println("0【退出】        1【继续】"); 
    int stopFlag=sc.nextInt(); 最后一句改为:int stopFlag=Integer.parseInt(sc.nextLine());具体原因参考:
    http://www.china-code.net/article/7/6/184034/ccQlssmG.html
      

  3.   

    我再问下,我用的是nextInt() 那条语句的作用只是获取控制台输入就可以了,为什么它会影响到后来调用start()方法呢?api上关于nextInt() nextLine()解释太抽象了
      

  4.   

    nextInt() 读整型nextLine() 读一行明白?
      

  5.   

    仔细想想想,终于明白了,原来next() 和nextInt() 都没有扫描换行符,留给了下一个扫描器,所以每次多一行,下次执行输入姓名时,先读了一次换行符,呵呵,理解对了吧,谢谢各位
      

  6.   

    正确。sc.nextLine()才能读到行扫描符。