【问题标题】:Cannot get input in simple output program in Java无法在 Java 中的简单输出程序中获取输入
【发布时间】:2018-03-29 16:26:13
【问题描述】:

我将保持简短,这是程序-

class Sample{
private int n;
public void getDetails(){
    Scanner y=new Scanner(System.in);
    n=y.nextInt();
    System.out.println("Entered 'n' = "+n);
}
public void displayDetails(){
    int i,j;
    int arr[]=new int[n];
    Scanner x=new Scanner(System.in);
    for(j=0;j<n;j++) {
        arr[j] = x.nextInt();
            System.out.println("Entered element = "+arr[j]);
    }
    System.out.println("Entered array: ");
    for(i=0;i<n;i++)
        System.out.print(arr[i]+" ");
    }
}

public class TestClass {
    public static void main(String[] args) {
        Sample obj = new Sample();
        obj.getDetails();
        obj.displayDetails();
        }
    }

这个简单的程序只是将元素的数量(n)和数组的元素(arr[])作为不同方法的输入。 当输入以交互模式给出时,一切正常。这是控制台输出-

5
Entered 'n' = 5
1 2 3 4 5
Entered element = 1
Entered element = 2
Entered element = 3
Entered element = 4
Entered element = 5
Entered array: 
1 2 3 4 5 

但是当我将它作为标准输入输入(或一次所有输入)时,它只需要元素的数量(n)并忽略我的数组输入(arr [])。在这里,我不得不再次给出数组元素。控制台输出-

5
1 2 3 4 5Entered 'n' = 5
1
Entered element = 1
2
Entered element = 2
3 4 5
Entered element = 3
Entered element = 4
Entered element = 5
Entered array: 
1 2 3 4 5 

我不知道发生了什么。它是一个错误吗?请帮忙

【问题讨论】:

    标签: java debugging input


    【解决方案1】:

    部分问题在于您正在创建多个扫描仪。创建一个扫描仪并在任何地方使用它,如下所示:

    import java.util.Scanner;
    
    public class TestClass {
        public static void main(String[] args) {
            Sample obj = new Sample();
            obj.getArraySize();
            obj.displayDetails();
        }
    }
    
    class Sample{
    
        private int arraySize;
        Scanner scanner = new Scanner(System.in);
    
        public void getArraySize(){
            System.out.print("Enter size of array: ");
            arraySize = scanner.nextInt();
            System.out.println("Entered array size = " + arraySize);
        }
    
        public void displayDetails(){
            //Create an integer array of size arraySize
            int intArray[] = new int[arraySize];
    
            //Repeatedly request integers for the array
            for( int i=0; i<arraySize; i++) {
                int nextInt = scanner.nextInt();
                intArray[i] = nextInt;
                System.out.println("Entered element = " + intArray[i]);
            }
    
            //Print out the entered elements
            System.out.println("Entered array: ");
            for( int i=0; i<arraySize; i++) {
                System.out.print(intArray[i]+" ");
            }
    
            scanner.close();
        }
    }
    

    控制台输出:

    Enter size of array: 5
    Entered array size = 5
    5 4 3 2 1
    Entered element = 5
    Entered element = 4
    Entered element = 3
    Entered element = 2
    Entered element = 1
    Entered array: 
    5 4 3 2 1 
    

    您仍然需要检查下一个值是否实际上是 int。如果您在其中输入不同类型的值,例如字母,它将崩溃。有关更多详细信息,请参阅这些链接:

    https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

    Java Multiple Scanners

    Why is not possible to reopen a closed (standard) stream?

    【讨论】:

    • 使用多台扫描仪的实际问题是什么?
    • 我没有很好的答案,抱歉。似乎新的扫描器要么刷新输入流,要么忽略输入流中已经存在的数据。
    【解决方案2】:

    您正在使用扫描仪获取用户输入。

     Scanner y=new Scanner(System.in);
    

    在 Scanner 类中,如果我们在七个 nextXXX() 方法中的任何一个之后调用 nextLine() 方法,则 nextLine() 不会从控制台读取值,并且光标不会进入控制台,它将跳过该步骤。 nextXXX() 方法是 nextInt()、nextFloat()、nextByte()、nextShort()、nextDouble()、nextLong()、next()。

    在 BufferReader 类中不存在此类问题。此问题仅发生在 Scanner 类中,因为 nextXXX() 方法忽略换行符并且 nextLine() 仅读取换行符。如果我们在 nextXXX() 和 nextLine() 之间再调用一次 nextLine() 方法,就不会出现这个问题,因为 nextLine() 会消耗换行符。

    请检查这个 SO link 它有很好的解释。

    【讨论】:

    • 我没有使用 nextLine() 方法。顺便说一句,将尝试使用 bufferedreader 方法
    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 2011-08-10
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多