Vấn đề nhập bị trôi lệnh trong java

mình mới học java mình có một đoạn code như sau
lớp QuanLy

public class QuanLy 
{
    public String name;
    public double a;
    public double b;
    public double c;
}

lớp chính là như này

package sinhvien;

import java.util.Scanner;

/**
 *
 * @author domin
 */
public class SinhVien {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
            
        // TODO code application logic here
        Scanner s = new Scanner(System.in);
        System.out.println("moi cac ban nhap so luong hoc sinh nha :");
        int a = Integer.parseInt(s.nextLine());
        QuanLy [] ab= new QuanLy[a];
 
        for(int i=0;i<a;i++)
        {
            ab[i]= new QuanLy();
        }
        int[] age= new int [a];
        for(int i=0;i<a;i++)
        {
            System.out.println("moi cac ban nhap ten nha ");
            ab[i].name=s.nextLine();
            System.out.println("moi cac ban nhap so diem a cua "+ab[i].name);
            ab[i].a=s.nextDouble();
            System.out.println("moi cac ba5n nhap so diem b cua  "+ab[i].name);
            ab[i].b=s.nextDouble();
            System.out.println("moi cac ban nhap so diem c  cua "+ab[i].name);
            ab[i].c=s.nextDouble();
        }
    } 
}

các bạn cho hỏi khi thực hiện vòn lặp for nhập đến điểm c thì khi quay lại nhập tên của người kế tiếp nó lại ko cho nhập nữa mà lại tiếp luôn đến điểm à của người tiếp theo xin cách khắc phục

Vấn đề ở đây là do Scanner của bạn, bởi vì sau khi nhập xong điểm c, thì bạn nhấn phím Enter để tiếp tục, nhưng thật không may là thằng Scanner lại nhận giá trị ‘\n’ của phím Enter cho lần readLine() tiếp theo. Cho nên lúc vòng lặp kế tiếp, Scanner sẽ tự động gán ‘\n’ cho biến name của ab[x], nên biến name có giá trị là “” (Nói chung là không có gì hết).
Nếu là mình thì trong vòng for mình sẽ khai báo 1 thằng Scanner khác để nhập input, và cứ hết 1 lần lặp, biến này sẽ bị hủy , và sang vòng lặp tiếp theo thì Scanner mới được sinh ra và tiếp tực thực hiện input. Vậy nên bạn sẽ không lo về việc Scanner sẽ giữ giá trị ‘\n’ khi kết thúc lần lặp nữa :grin:

Trên đây là cách của mình, mình không bao giờ dùng một Scanner cho nhiều biến cũng vì trường hợp của bạn.

Nếu bạn nào còn có giải pháp hay hơn thì chia sẽ nha. :grin:

1 Like

Do not open standard input stream in a loop, sở dĩ bị như vậy thì bạn nói đúng rồi, nhưng cách giải quyết cực đơn giản, hoặc là thêm 1 dòng nextDouble ở ngay sau dòng nextLine, hoặc gọi method flush của stream, open stream là 1 cost operation

1 Like

s=new Scanner(System.in); đây là cách của ông thầy mình bạn à sẽ thêm dòng này vào dòng cuối cùng

System.out.println("moi cac ban nhap so diem c  cua "+ab[i].name);
            ab[i].c=s.nextDouble();

hai cach giong nhau nhi

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?