2016-02-21 2 views
1

Я получил этот метод, чтобы умножить 2 матрицы:Null доступ указатель

public static AbstractMatrix multiplication(AbstractMatrix m1, AbstractMatrix m2) { 
    AbstractMatrix result = null; 
    int sum=0; 
    if (m1.getNbc() == m2.getNbl()) { 
     for(int c=0;c<m1.getNbl();c++){ 
      for(int d=0;d<m2.getNbc();d++){ 
       for(int k=0;k<m1.getNbc();k++){ 
        sum=somme+m1.getValeur(c, k)*m2.getValeur(k, d); 
       } 
       result.setValeur(c, d, sum); 
       sum=0; 
      } 
     } 

    } 
    return result; 
} 

Я получаю:

нулевой доступ указатель переменной результат может быть только нулевым

в это место: result.set(). Я знаю, что проблема в AbstractMatrix result=null;, но AbstractMAtrix - абстрактный класс, поэтому я не могу его создать (new AbstractMatrix).

Как это исправить?

+0

Вы пытались создать экземпляр любого класса, который «расширяет» абстрактный класс 'result'? – Idos

+0

экземпляр работает без проблем, у меня есть MapMatrix, 2DMatrix и да, вся эта работа, но здесь, в аргументе этого метода, igot поместить AbstractMatrix – Pika

+0

, одна вещь, которую вы могли бы сделать, это изменить интерфейс на 'public static void multiplication (AbstractMatrix m1, AbstractMatrix m2, AbstractMatrix r) 'и do' r = new SomeMatrixType() 'из того, где вы называете« умножение », так как там вы знаете класс, результат должен принадлежать – cobarzan

ответ

1

Вы правильно определили вашу проблему -> вы пытаетесь вызвать метод на null, который, очевидно, не может быть выполнен.
Кроме того, вы правильно указали, что AbstractMatrix является классом abstract и поэтому не может быть создан.

Что нужно сделать, чтобы исправить это?

Вы должны создать подкласс, скажем Matrix extends AbstractMatrix который переопределяет любые abstract методы в AbstractMatrix. Тогда вы можете создать его экземпляр следующим образом:

AbstractMatrix result = new Matrix(); 

Это сделает ваш код запуска правильно и не выбросит NPE.

+0

да, спасибо, но я думаю, что у меня будет другая проблема здесь, потому что здесь мне нужен метод setValeur, и этот метод является абстрактным в AbstractMatrix, и я должен переопределить его в каждом субкачестве, которое расширяет AbstractMatrix в зависимости от типа матрицы, потому что здесь я получил Mapmatrix, 1D MAtrix, 2D Matrix, у меня также есть ArrayLi stMatrix ,, но в классе матрицы, как и сказал, я не знаю, как переопределить метод setValeur – Pika

+0

Это не проблема. Если у вас есть 'setValeur', реализованный в вашем классе' abstract', вы можете использовать его в ** all ** своих подклассов, не переустанавливая его. Если ваш 'setValeur' также является« абстрактным », вам ** ** необходимо будет переопределить его в каждом подклассе' AbstractMatrix', действительно, чтобы ваша программа работала правильно. – Idos

+0

setValeur - абстрактный метод в AbstracMatrix, и я должен переопределить его для каждого подкласса – Pika