Java 在线编译器而非命令提示符上遇到运行时错误

Java 在线编译器而非命令提示符上遇到运行时错误,java,runtime,Java,Runtime,我不明白为什么这段java代码在命令提示符下运行良好,而不是在在线编译器中运行,并且出现运行时错误。 我试图在网上找到原因,但没有找到合适的答案 它的获取运行时错误- Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:862) at java.util.Scanner.next(Scanner.java:1485) at jav

我不明白为什么这段java代码在命令提示符下运行良好,而不是在在线编译器中运行,并且出现运行时错误。 我试图在网上找到原因,但没有找到合适的答案

它的获取运行时错误-

       Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at head.main(Main.java:9)
代码是-

       import java.util.*;


       class head
         {
       public static void main(String arg[])
        {
       Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int c1=0,c2=0;
        int i;
        while(n>0)
        {
        int l=sc.nextInt();
        String str=sc.next();

        for(i=0;i<l;i++)
        {
        char ch=str.charAt(i);
        if(ch=='i'||ch=='I') 
        c1++;
          if(ch=='y'||ch=='Y')
         c2++;
         } 
         if(c1>0)
         System.out.println("INDIAN");
        else if(c2>0)
        System.out.println("NOT INDIAN");
        else 
        System.out.println("NOT SURE");
        c1=0;
        c2=0;
        n--;
        }
       }
     } 
import java.util.*;
班长
{
公共静态void main(字符串arg[])
{
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
int c1=0,c2=0;
int i;
而(n>0)
{
int l=sc.nextInt();
字符串str=sc.next();
对于(i=0;i0)
System.out.println(“印度”);
否则,如果(c2>0)
System.out.println(“非印度”);
其他的
System.out.println(“不确定”);
c1=0;
c2=0;
n--;
}
}
} 

若扫描器有更多数据要扫描,则不检查扫描器,这就是为什么会出现异常

请参阅下面Scanner中定义的throwError方法

// If we are at the end of input then NoSuchElement;
// If there is still input left then InputMismatch
private void throwFor() {
    skipped = false;
    if ((sourceClosed) && (position == buf.limit()))
        throw new NoSuchElementException();
    else
        throw new InputMismatchException();
}
在注释中,它表示当输入结束时调用此函数

扫描仪的正确使用方法如下所示

Scanner scan = new Scanner(inputstream);

while(scan.hasNext()) {
    //read data
}
这与读取文件相同,每次尝试读取时都必须检查EOF(文件结束)

在您的代码中,可以像下面这样应用更正

import java.util.*;

class head {
    public static void main(String arg[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int c1 = 0, c2 = 0;
        int i;
        while (n > 0) {
            //check for EOF
            if(!sc.hasNext()) {
                break;
            }
            int l = sc.nextInt();
            String str = sc.next();

            for (i = 0; i < l; i++) {
                char ch = str.charAt(i);
                if (ch == 'i' || ch == 'I')
                    c1++;
                if (ch == 'y' || ch == 'Y')
                    c2++;
            }
            if (c1 > 0)
                System.out.println("INDIAN");
            else if (c2 > 0)
                System.out.println("NOT INDIAN");
            else
                System.out.println("NOT SURE");
            c1 = 0;
            c2 = 0;
            n--;
        }
    }
}
import java.util.*;
班长{
公共静态void main(字符串arg[]){
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
int c1=0,c2=0;
int i;
而(n>0){
//检查EOF
如果(!sc.hasNext()){
打破
}
int l=sc.nextInt();
字符串str=sc.next();
对于(i=0;i0)
System.out.println(“印度”);
否则,如果(c2>0)
System.out.println(“非印度”);
其他的
System.out.println(“不确定”);
c1=0;
c2=0;
n--;
}
}
}

您是否向联机编译器提供了stdin的输入?引发异常的行是什么?