У меня проблема с указателями в Java. Как исправить исключение java.lang.NullPointerException? - PullRequest
0 голосов
/ 14 ноября 2009

Это метод, который получает элемент из разреженной матрицы в Java. Я продолжаю получать java.lang.NullPointerException ошибку. Я просмотрел код и не могу найти ошибку.

public int getElement(int row,int col){
    int result = 0;
    MatrixEntry matrixentry = null;
    if ((row >= 0) && (row < getNumRows()) &&
        (col >= 0) && (col < getNumCols())) {
         if (col == colArray[col].getColumn() &&  row ==rowArray[row].getRow()){
        matrixentry = rowArray[row];
        while (matrixentry.getColumn() < col) {
                 matrixentry = matrixentry.getNextColumn();
        } // end while
                 if (matrixentry.getColumn() > col){
                     return 0;
                 }
                 if (matrixentry == null){
                     return 0;
                 }// 
             result = matrixentry.getData();

         }// 

    }// 
    return result;

} // end 

Ответы [ 4 ]

1 голос
/ 14 ноября 2009

Я рекомендую вам также запустить Findbugs в вашем коде. Он делает потрясающую работу, улавливая множество мелочей, например, проверку нулевого значения матрицы входа после того, как вы к ней уже обратились.

1 голос
/ 14 ноября 2009

Вы проверяете matrixentry на null после того, как уже использовали его в цикле while и вызываете .getColumn() и .getNextColumn().

Полагаю, ваш код будет лучше, если вы проверите сначала:

    matrixentry = rowArray[row];

    while (null != maxtrixentry && matrixentry.getColumn() < col) {
         matrixentry = matrixentry.getNextColumn();
    }

    if (null == maxtrixentry || matrixentry.getColumn() > col){
        return 0;
    }
    result = matrixentry.getData();
0 голосов
/ 14 ноября 2009

Вам нужно предварительно инициализировать элементы массива. Это описано в базовом учебнике Sun Java Arrays . Вы можете в конечном итоге использовать Arrays#fill() для этого.

0 голосов
/ 14 ноября 2009

Правильно ли инициализированы ваши rowAarray и colArray?
Согласно вашему комментарию они не являются.

Ваш код труден для чтения, и есть противоречивые проверки, подобные этой

if (matrixentry.getColumn() > col) { 
    return 0;
}
if (matrixentry == null){ 
    return 0;
} 

Вы вызываете метод для объекта и только затем проверяете его на ноль.

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

...