Hỏi về 1 code Java bị lỗi

Em mới học Java nên thử chuyển 1 đoạn code từ C++ trước đây sang Java nhưng bị lỗi:
Đề bài: https://www.spoj.com/PTIT/problems/PTIT018K/

Bài làm:

// package Spoj;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Solve{
    private static int n,S,E;
    private static int a[]=new int[1005],mark[]=new int[1005];
    static void Init(){
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        S=scanner.nextInt();
        E=scanner.nextInt();
        for (int i = 1; i <=n ; i++) {
            a[i]=scanner.nextInt();
        }
    }
    static void res(){
//        for (int i = 1; i <=n ; i++) {
//            mark[i]=0;
//        }
        mark[0]=-1;
        mark[n+1]=-1;
        mark[S]=1;
        Queue<Integer> q=new LinkedList<Integer>();
        q.add(S);
        while(!q.isEmpty()){
            int u=q.remove();
            if(u==E){
                System.out.println((mark[E]-1));
                return;
            }
            if(mark[u-1]==0){
                mark[u-1]=mark[u]+1;
                q.add(u-1);
            }
            if(mark[u+1]==0){
                mark[u+1]=mark[u]+1;
                q.add(u+1);
            }
            for(int i=1;i<=n;i++){
                if(mark[i]==0&&a[i]==a[u]){
                    mark[i]=mark[u]+1;
                    q.add(i);
                }
            }
        }
    }
}
 class Main {
    public static void main(String[] args) throws java.lang.Exception{
        Scanner scanner=new Scanner(System.in);
        int T=scanner.nextInt();
        while (T>0){
            T--;
            Solve a=new Solve();
            a.Init();
            a.res();
        }
    }
}

Lỗi gì bạn?

Exception in thread "main" java.util.NoSuchElementException
	at java.base/java.util.Scanner.throwFor(Scanner.java:937)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at Solve.Init(Main.java:12)
	at Main.main(Main.java:58)

Mình thấy bạn khởi tạo nhiều Scanner khác nhau. Điều này sẽ gây xung đột dẫn đến lỗi như trên. Bạn nên dùng 1 đối tượng Scanner chung để nhập dữ liệu.

3 Likes

nhưng 2 cái này ở 2 class khác nhau thì làm 2 cái Scanner kiểu gì ạ?

Thế bạn gọi trường (field) in trong lớp System đấy thôi System.in.

static

class Solve{
// ...

// Gọi thông qua Main.sc
        n = Main.sc.nextInt();
        S = Main.sc.nextInt();
        E = Main.sc.nextInt();

// ...
}
class Main{
    public static Scanner sc = new Scanner(System.in);
//...
}
3 Likes

oke cảm ơn ạ …

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