基本Java程序:字符串对象甚至不输入

时间:2014-09-03 08:14:05

标签: java

我是一名刚接触Java的C ++程序员,并且在将字符串作为字段(或属性或其他类)时遇到麻烦。

import java.util.Scanner;
class Student{
    String name;
    static int count=0;
    int regno;
    double marks;
    Student(){
        count++;
    }
    static void getCount(){
        System.out.println("Count is "+count);
    }
    void setName(String n1){
        name=n1;
    }
    void setMarks(double m1){
        marks=m1;
    }
    void setRegNo(int rno){
        regno=rno;
    }
    String getName(){
        return name;
    }
    int getRegNo(){
        return regno;
    }
    double getMarks(){
        return marks;
    }
}
class Demo{
    int i;
    Student s[]=new Student[3];
    Scanner in=new Scanner(System.in);
    Demo(){
        for(i=0;i<3;i++){
            s[i]=new Student();
            System.out.println("Enter name of student "+(i+1)+" :");
            s[i].setName(in.nextLine());
            System.out.println("Enter Reg. No. of student "+(i+1)+" :");
            s[i].setRegNo(in.nextInt());
            System.out.println("Enter marks of student "+(i+1)+" :");
            s[i].setMarks(in.nextDouble());
        }
    }
    public void Display(){
        System.out.println("Students with marks >70 : ");
        System.out.println("RegNo\tName\tMarks\t");
        for(i=0;i<3;i++){
            System.out.println(s[i].getRegNo()+"\t"+s[i].getName()+"\t"+s[i].getMarks());
        }
    }
}
class P4{
    public static void main(String args[]){
        Demo d=new Demo();
        d.Display();
    }
}

输出:

Enter name of student 1 :
1
Enter Reg. No. of student 1 :
1
Enter marks of student 1 :
100
Enter name of student 2 :
Enter Reg. No. of student 2 :
2
Enter marks of student 2 :
100
Enter name of student 3 :
Enter Reg. No. of student 3 :
3
Enter marks of student 3 :
100
Students with marks >70 : 
RegNo   Name    Marks   
1   1   100.0
2       100.0
3       100.0

麻烦: 从for循环的第二次迭代开始,程序直接要求我输入regno并标记跳过名称String.I不理解它是如何工作的第一次迭代而不是其他的。请解释我这里出了什么问题

3 个答案:

答案 0 :(得分:1)

我猜这是与许多人一样的问题。 C中的scanf,即前一个输入的结束换行符仍在输入缓冲区中,这导致nextLine函数将此换行符视为空行。

您需要一种在输入字符串之前丢弃前导空格的方法。

答案 1 :(得分:0)

in.nextLine()

之后输入s[i].setMarks(in.nextDouble());

发生了什么:

for(i=0;i<3;i++){
            s[i]=new Student();
            System.out.println("Enter name of student "+(i+1)+" :");
            s[i].setName(in.nextLine()); // second time around, you read the newline character
            System.out.println("Enter Reg. No. of student "+(i+1)+" :");
            s[i].setRegNo(in.nextInt());// once you press "enter" here, the newline 
            System.out.println("Enter marks of student "+(i+1)+" :");
            s[i].setMarks(in.nextDouble());// once you press "enter" here, the newline character is added to the input stream
        }

答案 2 :(得分:0)

问题在于您将nextInt() / nextDouble()nextLine()混合在一起。

当您输入int / double时,后面会有一个新行,当您在下一次迭代中调用nextLine()时,它会读取此新行。< / p>

解决方法是在致电nextLine() / nextInt()后致电nextDouble()(并弃掉结果)。

这是一个展示问题(和解决方案)的简单代码:

try (Scanner in = new Scanner(System.in)) {
    System.out.println("Int:");
    in.nextInt();
    // in.nextLine(); // uncomment to fix the problem
    System.out.println("Line:");
    in.nextLine();
}