我需要从键盘到表格读取值,我猜它已超出范围,但无法弄清楚如何修复它。
线程“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;
}
}
答案 0 :(得分:1)
这是因为double matrix[][];
未初始化,null
答案 1 :(得分:1)
您永远不会实例化Matrix
类'matrix
变量。在此行上构建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
答案 2 :(得分:0)
您的数组已声明但从未实例化。添加以下行:
tab.matrix = new double[parser][parser];
之后:
tab.rozmiar = parser;