поток закрывается, когда второй объект вызывает этот метод для ввода данных - PullRequest
0 голосов
/ 27 апреля 2020

поток закрывается при вызове второго объекта метода getMatrix () для ввода данных #

** Я пытаюсь прочитать данные с клавиатуры с помощью BufferedReader obj. для двух матриц, использующих два отдельных объекта, при использовании 1-го объекта работает корректно ввод, но при вызове через второй объект возникает исключение "STREAM CLOSED" ПОЧЕМУ? при каждом вызове объекта методом getMatrix () для добавления данных в матрицу и ввода данных с клавиатуры в этом методе получается объект Stream для получения данных с клавиатуры, а конец метода закрывает поток, снова вызывается из другого объекта метод getMatrix () и тот же процесс, но во время вызова второго объекта возникла исключительная ситуация ... Поток закрыт ...... **

        package myarray; 
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.util.StringTokenizer;

        public class Matrix
        {
            int r,c;
            int arr[][];//instance optional initialization
            public Matrix(int r, int c) 
            {
                super();
                this.r = r;
                this.c = c;
                arr=new int[r][c];
            }
            //Stream closed problem
            protected int[][] getMatrix() throws IOException
            {
            try(BufferedReader br=new BufferedReader(new InputStreamReader(System.in));)
                {
                StringTokenizer st;
                for(int i=0; i<arr.length; i++)
                    {
                    System.out.println("Enter "+arr[i].length+" Integer separated with space");
                    String s=br.readLine();
                    st=new StringTokenizer(s);
                    for(int j=0; j<st.countTokens(); j++)
                        {
                        arr[i][j]=Integer.parseInt(st.nextToken());
                        }
                    }
                return arr;
                }
            }
            //stream end
            protected int [][]findSum(int a[][],int b[][])
            {
                int temp[][]=new int[r][c];//local must be initialize

                for(int i=0; i<a.length; i++)//outer loop
                    for(int j=0; j<a[i].length; j++)//inner loop
                        temp[i][j]=a[i][j]+b[i][j];//inner loop business logic

                return temp;
            }

            //Display the result matrix
            protected void display(int res[][])
            {
                for(int i=0; i<res.length; i++)
                {
                    for(int j=0; j<res[i].length; j++)
                    {
                        System.out.print(res[i][j]+"  ");
                    }
                    System.out.println();
                }
            }

            public static void main(String[] args) throws IOException 
            {
                Matrix m1=new Matrix(3, 3);//3row and 3 column
                Matrix m2=new Matrix(3, 3);

                System.out.println("Enter element for First matrix");
                int x[][]=m1.getMatrix();

                System.out.println("Enter element for Second matrix");
                int y[][]=m2.getMatrix();

                //add matrix and return result a matrix
                int z[][]=m1.findSum(x, y);

                System.out.println("\nThe Sum Matrix is :");
                m2.display(z);

            }
        }
        /* ******OUTPUT******
        Enter element for First matrix
        Enter 3 Integer separated with space
        1 2 3
        Enter 3 Integer separated with space
        4 5 6
        Enter 3 Integer separated with space
        7 8 9
        Enter element for Second matrix
        Exception in thread "main" Enter 3 Integer separated with space
        java.io.IOException: Stream closed
         * */

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Я думаю, что проблема в следующем:

try(BufferedReader br=new BufferedReader(new InputStreamReader(System.in));)

Этот синтаксис называется try-with-resources, который преобразует в блок try ... finally во время компиляции и после преобразования объект внутри этот блок вызовет метод close () (обратите внимание, что сам объект должен реализовывать интерфейс AutoCloseable, чтобы использовать эту функцию). Вот почему при первом вызове метода он работает нормально, но после этого он закрывает BufferedReader, а затем возникает ошибка «STREAM CLOSED»

0 голосов
/ 27 апреля 2020

Проблема в том, что вы создаете BufferedReader с использованием синтаксиса try-with-resources, который закрывает ресурс после использования. Этот синтаксис подходит для чтения данных из файла, но не из System.in, поскольку он не только закрывает BufferedReader, но и System.in.

Решение:

Создайте BufferedReader экземпляр без синтаксиса try-with-resources и НЕ закрывайте его.

Сделайте это следующим образом:

protected int[][] getMatrix() throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    for (int i = 0; i < arr.length; i++) {
        System.out.println("Enter " + arr[i].length + " Integer separated with space");
        String s = br.readLine();
        st = new StringTokenizer(s);
        for (int j = 0; j < st.countTokens(); j++) {
            arr[i][j] = Integer.parseInt(st.nextToken());
        }
    }
    return arr;
}
...