Lỗi java.util.NoSuchElementException trên Java with Gradle

Chào mọi người, tui hiện đang học ngôn ngữ java. Chuyện là khi đang làm bài hướng dẫn ở trang codelearn.io chương method:

Đề là Bạn hãy viết phương thức hiển thị ra màn hình những xâu có độ dài lớn hơn 3 trong mảng arr . Nhận input gồm số lượng string và nội dung các string này.

Tui có tạo thêm cái Scanner bên method khác:

  • Khi run trên codelearn thì nó có báo là java.util.NoSuchElementException
  • Khi run trên IDE netbean Java with Maven thì vẫn chạy như thường.

Code:

private static void showString( String[] str ){
    int amount   = str.length;
    for( int i = 0 ; i < amount ; i++ ){
        if( str[i].length() > 3 ){
            System.out.print( str[i] + " " );
        }
    }
}
public static void getString( String[] str ){
    Scanner scan = new Scanner( System.in );
    int amount   = str.length;
    for( int i = 0 ; i < amount ; i++ ){
        str[i] = scan.next();
    }
}
public static void main( String args[] ){
    Scanner scan = new Scanner( System.in );
    int amount   = scan.nextInt();
    String str[] = new String[ amount ];
    getString( str );
    showString( str );
}

Sau đó tui dùng cách truyền Scanner ở main qua, thì:

  • Khi run trên codelearn hay netbeans Java with Marven( cả JDK 8 vả JDK 14) thì chạy được.
  • Khi run trên netbeans Java with Gradle( JDK 14) thì lại bị java.util.NoSuchElementException.

Code single Scanner:

private static void showString( String[] str ){
    int amount   = str.length;
    for( int i = 0 ; i < amount ; i++ ){
        if( str[i].length() > 3 ){
            System.out.print( str[i] + " " );
        }
    }
}
public static void getString( String[] str, Scanner scan ){
    int amount   = str.length;
    for( int i = 0 ; i < amount ; i++ ){
        str[i] = scan.next();
    }
}
public static void main( String args[] ){
    Scanner scan = new Scanner( System.in );
    int amount   = scan.nextInt();
    String str[] = new String[ amount ];
    getString( str, scan );
    showString( str );
}

Java with Gradle got Error:

Có vấn đề gi với việc tạo ra nhiều Scanner vậy?

Có ai giúp giải thích cho tui hoặc ném link vào mặt tui cũng được

Xin cảm ơn.

Theo em thì lỗi có lẽ là ở next()
Anh check hasNext() trước rồi hãy scan xem sao.

1 Like

Theo mình đoán codelearn chỉ yêu cầu bạn viết method hiển thị, không yêu cầu bạn viết method main. Bạn chỉ cần nộp method hiển thị.

Mình đoán vậy vì codelearn clone codesignal mà :v

7 Likes

Codelearn.io hầu hết là xử lý dữ liệu trả về kết quả thôi, phần nhập/xuất họ làm hết rồi.

6 Likes

@Le_Trong1
Tớ nghĩ cậu nên đọc câu trả lời này, nó sẽ giúp cậu hiểu được chuyện gì xảy ra nếu cậu có nhiều scanner dùng cùng 1 input stream.

5 Likes

Cảm ơn về cái link, cái lỗi tui gặp do vấn đề khác nhưng dù sao thì sau kiểu gì cũng bị. Cho tui hỏi thêm về việc vì sao tui xem các ví dụ trên stackoverflow người ta thường hay có lệnh close cái scanner lại, nó có cần thiết hay không ?

1 Like

Khi bạn xác định là chương trình thực sự kết thúc thì có thể gọi close().
Nhưng nếu gọi close() một cách thừa thãi thì nó sẽ có lỗi như tiêu đề của cuộc thảo luận này.
Khi gọi Scanner.close() thì Scanner đóng luôn luồng nó đang thao tác (InputStream). Tức ngắt luôn thao tác nhập, mặc dù có thể có vài Scanner khác vẫn đang thao tác chưa xong.


Thằng A qua cầu treo xong thì cắt dây, các thằng phía sau khỏi qua luôn.

Qua cầu rút ván.

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