【问题标题】:Weird input error when taking Sdin(or non-interactive) input | Java采用 Sdin(或非交互式)输入时出现奇怪的输入错误 |爪哇
【发布时间】:2018-09-03 13:29:14
【问题描述】:

这是我用于输入和打印输出的简单 Java 代码。

import java.util.Scanner;
    //weird input problem
    class Student{
        private int rollno;
        private String name;
        public void getRollNo(){
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter name and roll no");
            name=sc.next();
            rollno=sc.nextInt();
        }
        public void putRollNo(){
            System.out.println("Name="+name);
            System.out.println("Regno="+rollno);
        }
    }
    class Marks extends Student{
        Scanner sc = new Scanner(System.in);
        protected int Mark1,Mark2,Mark3;
        public void getMarks(){
            System.out.println("Enter 3 Marks");
            Mark1=sc.nextInt();
            Mark2=sc.nextInt();
            Mark3=sc.nextInt();
        }
        public void putMarks(){
            System.out.println("Mark1="+Mark1);
            System.out.println("Mark2="+Mark2);
            System.out.println("Mark3="+Mark3);
        }
    }
    class Result extends Marks{
        void computeDisplay(){
            float total = Mark1 + Mark2 + Mark3;
            System.out.println("Total="+ total);
        }
    }
    public class MyClass{
        public static void main(String[] args){
            Result r = new Result();
            r.getRollNo();
            r.getMarks();
            r.putRollNo();
            r.putMarks();
            r.computeDisplay();
        }
    }

因此,当逐行输入(交互式控制台输入)时,它可以完美运行,这就是我的 IDE 控制台显示的内容

Enter name and roll no
John
1234
Enter 3 Marks
11
22
33
Name=John
Regno=1234
Mark1=11
Mark2=22
Mark3=33
Total=66.0

真正的问题是当我将输入作为文本给出时。 我将此作为输入-

John
1234
11
22
33

看起来程序只是忽略了一些输入(在这种情况下是“标记”),所以我不得不再次输入标记。控制台输出-

Enter name and roll no
John
1234
11
22
33Enter 3 Marks
1
2
3
Name=John
Regno=1234
Mark1=1
Mark2=2
Mark3=3
Total=6.0

当我在jdoodle compiler 中输入“交互模式”设置为“关闭”时,它只会返回此错误-

Enter name and roll no
Enter 3 Marks

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:858)
at java.base/java.util.Scanner.next(Scanner.java:1497)
at java.base/java.util.Scanner.nextInt(Scanner.java:2161)
at java.base/java.util.Scanner.nextInt(Scanner.java:2115)
at Marks.getMarks(MyClass.java:22)
at MyClass.main(MyClass.java:42)

Command exited with non-zero status 1

我不知道。请帮忙

【问题讨论】:

    标签: java debugging input runtime-error stdin


    【解决方案1】:

    Java Scanner 等待您,直到输入发送到控制台并命中回车。您的程序按预期运行。

    但是,您想按顺序获取所有输入,试试这个:

    Scanner input = new Scanner(System.in);
    
    while(input.hasNext()) {  
         roll = input.nextInt();
         marks = input.nextInt();
         ...
    }
    

    【讨论】:

    • 我没有从文件中获取输入,我只是将整个输入作为文本或一次全部输入,抱歉我不知道它到底叫什么
    • 好的,然后重新格式化您的代码以立即接受整个序列。编写一个名为getResult() 的方法,它将用逗号分隔Roll,Marks touples,然后您可以split(",")。给你完整的代码是违反 SO 规则的。
    • 对不起,输入不在一行中,就像您在在线编译器的非交互式文本字段中提供整个输入时一样(是标准输入输入吗?)就像在图像中一样-@987654321 @
    • 明白,请查看我更新的答案。同样,我无法为您提供确切的实现。尝试在 getRoll() 和 getMarks() 中使用这些循环
    • 我在 getMarks() 方法中使用了你的循环,现在错误消失了,但现在在所有 3 个标记中设置的值都是 0
    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多