代码相同但输出不同

时间:2016-11-19 08:02:14

标签: java input

首先我希望用户输入一些东西(名字,联系人,idnumber),我会显示2个不同的文件,但代码是相同的。第一个代码问题是“名称”输入位置消失,第二个但不会消失任何人都可以告诉我这个问题吗?我是java新手。

public class Admin {
static Scanner scan= new Scanner(System.in);
static Client client = new Client();
    public void admin(){
        newClient []nc = new newClient[10]; 
        \\login();
     while(true){
        System.out.println("Select 1:add Client\n 2:add Account\n 3:login as Client");
        try{
        int selection = scan.nextInt();
        switch(selection)
        {
        case 1: addClient(nc);
                break;
        case 2: \\addAccount(nc);
                break;  
        case 3: ;
                break;
        default: System.out.println("INvalid selection");
        }
        }
        catch(InputMismatchException ex){
        System.out.println("Invalid input");
         scan.nextLine();
            }
        }    
    } 
    public void addClient(newClient []nc){
    for(int i=0;i<nc.length;i++){
    System.out.println("Enter name");
    String name = scan.nextLine();
    System.out.println("Enter contact");
    String contact = scan.nextLine();
    System.out.println("Enter id number");
    String idNumber = scan.nextLine();
    nc[i]=new newClient(name,contact,idNumber);
    System.out.println(nc[i]);
    }
    }

第一个代码的输出是

输入姓名

输入联系人

为什么缺少名称输入位置? 还有第二个代码

public static void main(String[]args){
    Scanner scan =new Scanner(System.in);
    for(int i=0;i<nc.length;i++){
    System.out.println("Enter name");
    String name = scan.nextLine();
    System.out.println("Enter contact");
    String contact = scan.nextLine();
    System.out.println("Enter id number");
    String idNumber = scan.nextLine();
    nc[i]=new newClient(name,contact,idNumber);
    System.out.println(nc[i]);
    }
    }

第二个代码工作正常。

输入姓名

输入联系人

输入idNumber

2 个答案:

答案 0 :(得分:1)

这两段代码实际上是不同的。

在第二个代码中,scan对象是一个全新的对象。您调用的唯一方法是nextLine()。在第一个代码中,scan对象创建了一个类级别,并且在调用addClient之前已使用

&#34;已被使用&#34;这里非常重要。我的意思是你在nextInt上调用了scan然后nextLine

    int selection = scan.nextInt(); <-- You called nextInt here!
    switch(selection)
    {
    case 1: addClient(nc);
            break;
    case 2: \\addAccount(nc);
            break;  
    case 3: ;
            break;
    default: System.out.println("INvalid selection");
    }
    }
    catch(InputMismatchException ex){
    System.out.println("Invalid input");
     scan.nextLine();
        }
    }    
} 
public void addClient(newClient []nc){
    for(int i=0;i<nc.length;i++){
        System.out.println("Enter name");
        String name = scan.nextLine(); <-- then you called nextLine here!
        System.out.println("Enter contact");
        String contact = scan.nextLine();
        System.out.println("Enter id number");
        String idNumber = scan.nextLine();
        nc[i]=new newClient(name,contact,idNumber);
        System.out.println(nc[i]);
    }
}

这使得nextLine方法返回一个空字符串。

  

为什么?

让我们看看nextIntnextLine的{​​{3}}:

  

nextInt()

     

将输入的下一个标记扫描为int。

     

nextLine()

     

使此扫描程序超过当前行并返回跳过的输入。

我创建了一个更简单的代码来重现这种情况,以解释为什么在nextLine之后立即调用nextInt会导致问题:

Scanner s = new Scanner(System.in);
s.nextInt();
System.out.println(s.nextLine());

我将使用|字符来表示扫描仪的当前位置。

程序启动时,

|

然后我输入数字20:

|20

现在扫描仪读取20,根据文件,扫描仪应该在这个位置:

20|

有趣的部分,nextLine&#34;推进此扫描程序超过当前行并返回跳过的输入。&#34;

20
|

那么扫描仪跳过什么输入?没有!结果,返回一个空字符串。

答案 1 :(得分:0)

ΦXocę 웃 Пepeúpa ツ表示scan.nextInt无法阅读enter

所以替代解决方案是在阅读name contact id信息之前,使用scan.nextLine()来阅读enter,如下所示:

public void addClient(newClient []nc){
    scan.nextLine();
    for(int i=0;i<nc.length;i++){
       ....// your origin code
    }