无法在Java中的简单输出程序中获得输入

时间:2018-03-29 16:26:14

标签: java debugging input

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

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 

但是当我把它作为Stdin输入(或者所有输入一次)时,它只需要元素数(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 

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

2 个答案:

答案 0 :(得分:0)

您正在使用扫描程序来获取用户输入。

 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它有很好的解释。

答案 1 :(得分:0)

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

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?