Java NullPointerException во время чтения с клавиатуры - PullRequest
0 голосов
/ 15 ноября 2010

Мне нужно прочитать значения с клавиатуры в таблицу, и я думаю, это выходит за пределы диапазона, но не могу понять, как это исправить.

Исключение в потоке "main" java.lang.NullPointerException в B12.App.main (App.java:36)

Это та строка tab.matrix[ai][aj]=parser;

Весь код:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Matrix{
    public Matrix() {

    }
    int rozmiar;
    double matrix[][];
}

public class App {
    public static void main(String[] args){
        Matrix tab = new Matrix();
        int parser;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in) );
        System.out.println("Podaj rozmiar macierzy: ");
            try {
                parser = Integer.parseInt(br.readLine());
                tab.rozmiar = parser;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            System.out.println("Uzupelnij wiersze macierzy: ");
                for(int ai=1; ai<=tab.rozmiar; ai++){
                    for(int aj=1; aj<=tab.rozmiar; aj++){
                        BufferedReader zm = new BufferedReader(new InputStreamReader(System.in) );
                            try {
                                parser = Integer.parseInt(zm.readLine());
                                tab.matrix[ai][aj]=parser;
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }               
                    }
                }
                drukuj(tab);
        }

        static void drukuj(Matrix m){
            int ai,aj;
            for(ai=1; ai>=m.rozmiar; ai++)
            {
                for(aj=1; aj>=m.rozmiar; aj++)
                {
                    if(ai==1){
                    System.out.println("[" + m.matrix[ai][aj]);
                    }
                    if(ai!=1 && ai==m.rozmiar){
                        System.out.println(" " + m.matrix[ai][aj] + " " );
                    }
                    else if(ai==m.rozmiar){
                    System.out.println(m.matrix[ai][aj] + "]" );
                    }
                }
            }
        }

    public double Det(Matrix m){
        double wynik = 0;

        if(m.rozmiar==1){
            wynik=m.matrix[1][1];
        }
        else if(m.rozmiar==2){
            wynik=(m.matrix[1][1]*m.matrix[2][2])-(m.matrix[1][2]*m.matrix[2][1]);
        }
        else{
            for(int n=1; n<m.rozmiar +1; n++){
                Matrix tmpM = new Matrix();
                tmpM.rozmiar=m.rozmiar - 1;
                int k=1,j;
                for(j=2; j<m.rozmiar; j++){
                    for(k=1; k<m.rozmiar; k++){
                        if(k>n) tmpM.matrix[j-1][k] = m.matrix[j][k];
                        else if(k<n) tmpM.matrix[j-1][k-1] = m.matrix[j][k];                    }
                }   
            wynik+=m.matrix[1][n]*Math.pow(-1, (j+k))*Det(tmpM);    
            }
        }

        return wynik;
    }
}

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

Вы никогда не создаете экземпляр переменной Matrix class 'matrix. Когда вы строите Матрицу в этой строке:

Matrix tab = new Matrix();

поля rozmiar и matrix будут инициализированы в значения по умолчанию (пустые), которые равны null для поля matrix.

Тогда это никогда не назначается позже, но вы пытаетесь отложить его в рассматриваемой строке, что создает исключение NullPointerException.

Исправление заключается в инициализации матрицы, когда вы знаете размер, что-то вроде этого в строке 23:

tab.rozmiar = parser;
tab.matrix = new double[parser][];

Обратите внимание, что это двумерный массив, поэтому вам необходимо также создать каждый вложенный массив, например, по строке 32:

for(int ai=1; ai<=tab.rozmiar; ai++){
    tab.matrix[ai] = new double[tab.rozmiar];
    for(int aj=1; aj<=tab.rozmiar; aj++){

Однако лучшим решением может быть полное избавление от пустого конструктора Matrix и вместо этого добавить конструктор, который принимает целочисленный аргумент и устанавливает поля. Это улучшение, поскольку тогда невозможно построить объект в недопустимом состоянии - всегда лучше требовать аргументы в конструкторе, чем инициализировать пустой объект позже.

Так что это может выглядеть так:

class Matrix{
public Matrix(int size) {
    rozmier = size;
    matrix = new double[size][];
    for (int i = 0; i < size; i++)
    {
        matrix[i] = new double[size];
    }
}
final int rozmiar;
final double matrix[][];

}

и затем, чтобы использовать его, вы сначала не создадите пустое tab, а определите размер для его создания, что-то вроде этого:

public static void main(String[] args){
    int parser;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in) );
    System.out.println("Podaj rozmiar macierzy: ");
        try {
            parser = Integer.parseInt(br.readLine());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    Matrix tab = new Matrix(parser);

    // The rest as before
1 голос
/ 15 ноября 2010

Это потому, что double matrix[][]; не инициализирован, его null

0 голосов
/ 15 ноября 2010

Ваш массив объявлен, но никогда не создается.Добавьте эту строку:

tab.matrix = new double[parser][parser];

после этого:

tab.rozmiar = parser;
...