2016-02-11 3 views
0

У меня возникают проблемы с проблемой java. Я получаю эту ошибку: Исключение в теме "main" java.lang.NullPointerException at DoubleMatrix.getDim1Size (DoubleMatrix.java:28) at Program3.main (Program3.java:16) Я не понимаю, где это nullОшибка исключения нулевого указателя в классе DoubleMatrix

public class DoubleMatrix 
{ 
    private double[][] doubMatrix; 

    public DoubleMatrix(int firstDim, int secondDim, double upperLimit) 
    { 
     if(firstDim > 0 && secondDim > 0 && upperLimit > 0){ 
      firstDim = 1; 
      secondDim = 1; 
      upperLimit = 1; 
     } 
    } 

    public DoubleMatrix(double[][] tempArray) 
    { 
     if(tempArray != null && tempArray.length != 0){ 
      for(int i =0; i < tempArray.length; i++) { 
       doubMatrix = tempArray; 
      } 
     } 
     else{ 
      tempArray = new double[1][1]; 
     } 
    } 

    public int getDim1Size(){ 
     int firstDim1 = doubMatrix.length; 
     return firstDim1; 
    } 
    public int getDim2Size(){ 
     int secondDim1 = doubMatrix[0].length; 
     return secondDim1; 
    } 

    private void makeDoubMatrix(int firstDim, int secondDim, double upperLimit){ 
     double[][] randomMatrix = new double[firstDim][secondDim]; 

     for(int row = 0; row < doubMatrix.length; row++) { 
      for(int column = 0; column < doubMatrix[row].length; column++){ 
       doubMatrix[row][column] = (double)(Math.random() * 100); 
      } 
     } 

    } 
    public DoubleMatrix addMatrix(DoubleMatrix arrayObj) 
    { 
     if(doubMatrix.length == arrayObj.doubMatrix.length && doubMatrix[0].length == arrayObj.doubMatrix[0].length){ 
      double[][] TotalTwoDimArray = new double[doubMatrix.length][doubMatrix[0].length]; 
      for(int row = 0; row < TotalTwoDimArray.length; row++){ 
       for(int column = 0; column < TotalTwoDimArray[row].length; column++){ 
        TotalTwoDimArray[row][column] = doubMatrix[row][column] + arrayObj.doubMatrix[row][column]; 
       } 
      } 
      return new DoubleMatrix(TotalTwoDimArray); 
     } 
     return new DoubleMatrix(1, 1, 1); 
    } 
    public DoubleMatrix getTransposedMatrix(){ 
     double[][] TransMatrix = new double[doubMatrix[0].length][doubMatrix.length]; 
     for(int row = 0; row < doubMatrix.length; row++){ 
      for(int column = 0; column < doubMatrix[row].length; column++){ 
       TransMatrix[row][column] = doubMatrix[column][row]; 
      } 
     } 
     return new DoubleMatrix(TransMatrix); 
    } 

    public DoubleMatrix multiplyMatrix(DoubleMatrix obj1) 
    { 
     if(doubMatrix[0].length == obj1.doubMatrix.length){ 
      double[][] multipliedMatrix = new double[doubMatrix.length][obj1.doubMatrix[0].length]; 

      for(int i = 0; i < multipliedMatrix.length; i++){ 
       for(int j = 0; j < multipliedMatrix[i].length; j++){ 
        for(int k = 0; k < doubMatrix[0].length; k++){ 
         multipliedMatrix[i][j] = doubMatrix[i][k] * obj1.doubMatrix[k][j] + multipliedMatrix[i][j]; 
        } 
       } 
      } 
      return new DoubleMatrix(multipliedMatrix); 
     } 
     return new DoubleMatrix(1, 1, 1); 
    } 
    public void printMatrix(String titles){ 
     System.out.println(titles); 

     for(int row = 0; row < doubMatrix.length; row++){ 
      for(int column = 0; column < doubMatrix[row].length; column++){ 
       System.out.printf("%9.1f", doubMatrix[row][column]); 
      } 
      System.out.println(); 
     } 
    } 

} 

// main in different class 
public class Program3 
{ 
    public static void main(String[] args) 
    { 
     DoubleMatrix doubMatObj1; 
     DoubleMatrix doubMatObj2; 
     DoubleMatrix doubMatObj3; 

     int max = 10; 
     int min = 3; 
     int firstDim = (int)(Math.random() * (max - min + 1) + min); 
     int secondDim = (int)(Math.random() * (max - min + 1) + min); 

     doubMatObj1 = new DoubleMatrix(firstDim, secondDim, 100.); 
     doubMatObj2 = new DoubleMatrix(doubMatObj1.getDim1Size(), doubMatObj1.getDim2Size(), 100.); 
     doubMatObj3 = doubMatObj1.addMatrix(doubMatObj2); 
     doubMatObj1.printMatrix("First Matrix Object"); 
     doubMatObj2.printMatrix("Second Matrix Object"); 
     doubMatObj3.printMatrix("Result of Adding Matrix Objects"); 
     doubMatObj2.printMatrix("Result of Transposing Matrix Object"); 
     doubMatObj1.multiplyMatrix(doubMatObj2); 
     doubMatObj3.printMatrix("Result of Multiplying Matrix Objects"); 
    } 
} 
+0

- это 'doubMatrix' опечатка, или вы назовете это намеренно? –

+0

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

ответ

0

В java не примитивы не инициализируются, просто объявляя их. Поэтому, если вы получите NullPointerException в строке, такой как foo.bar(), вы знаете, что foo должен был быть null. В вашем случае у вас есть doubMatrix.length, что указывает на то, что doubMatrix не был инициализирован. Глядя на ваш код, только второй конструктор когда-либо инициализирует эту переменную, поэтому вызов первого конструктора оставит doubMatrix==null всегда true.

Надеюсь, вам будет достаточно информации, чтобы помочь вам решить проблему самостоятельно (и подобные проблемы в будущем), но я не буду публиковать пример рабочего кода, так как исправление кода само по себе будет хорошим упражнением!

Замечание, что в вашем втором конструкторе у вас есть:

for(int i =0; i < tempArray.length; i++) { 
    doubMatrix = tempArray; 
} 

Если tempArray.length, например, 5, вы бы присвоить то же значение 5 раз в одной и той же переменной. Я не знаю, что вы пытаетесь сделать там, но это, конечно, не то, что вы имели в виду.

Смежные вопросы