从键盘读取时出现Java NullPointerException

时间:2010-11-15 11:59:42

标签: java nullpointerexception readline

我需要从键盘到表格读取值,我猜它已超出范围,但无法弄清楚如何修复它。

  

线程“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 个答案:

答案 0 :(得分:1)

这是因为double matrix[][];未初始化,null

答案 1 :(得分:1)

您永远不会实例化Matrix类'matrix变量。在此行上构建Matrix时:

Matrix tab = new Matrix();

rozmiarmatrix字段将初始化为默认(空)值,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

答案 2 :(得分:0)

您的数组已声明但从未实例化。添加以下行:

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

之后:

tab.rozmiar = parser;