如何避免在我的Matrix总和中获得NullPointerException?

时间:2015-07-21 20:51:51

标签: java matrix nullpointerexception

我想检查任何矩阵中每行的总和是否相等。我应该如何重写这个以避免NPE?

我可以使它适用于像int[][] a = {{1,2,3}, {4,5,6}}这样的“普通”矩阵,但我希望它能够在使用null和空矩阵进行测试时工作。

public static boolean allRowSumsEqual(int[][] m) {
  boolean a = false;
  int x = 0;
  int total = rowSum(m[0]);

  for (int i = 0; i < m.length; i++) {
    for (int j = 0; j < m[i].length; j++) {
      x += m[i][j];
    }
    if (x != total) {
      a = false;
      break;
    } else {
      x = 0;
      a = true;
    }
  }
  return a;
}

public static int rowSum(int[] v) {
  int vSum = 0;
  for (int i = 0; i < v.length; i++) {
    vSum += v[i];
  }
  return vSum;
}

4 个答案:

答案 0 :(得分:2)

正如你所说,这适用于大多数矩阵。有几个地方我可能会检查null,请参阅下面的修改代码:

public class Foo {
  private long swigCPtr;
  protected boolean swigCMemOwn;

  public Foo(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

  public static long getCPtr(Foo obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  ...

答案 1 :(得分:1)

如果要检查&#34; null&#34;您需要定义结果或异常。参数。如果null有效,您可以返回true,否则返回false

if(m == null) return true;

空或一个带衬里的矩阵可以一直返回true,不需要任何计算:

if(m.length < 2) return true;

线路测试更简单,我认为:

// expect a positiv result
boolean result = true;
// calculate first line
int firstLine = rowSum(m[0]);

// loop remaining lines
for (int i = 1 ; i < m.length ; i++){
    // compare first line with current line
    if (firstLine != rowSum(m[i]))
    {
       // not equal -> change result 
       result = false;
       // break loop
       break;
    }   
}
return result;

答案 2 :(得分:0)

public class Snippet {
    public static boolean allRowSumsEqual(int[][] m) {
        if (null == m || 0 == m.length)
            return true;
        boolean a = false;
        int x = 0;
        int total = 0;
        if (null != m[0])
            total = rowSum(m[0]);

        for (int i = 1; i < m.length; i++) {
            if (null != m[i]) {
                for (int j = 0; j < m[i].length; j++) {
                    x += m[i][j];
                }
            } else
                x = 0;
            if (x != total) {
                a = false;
                break;
            } else {
                x = 0;
                a = true;
            }

        }
        return a;
    }

    public static int rowSum(int[] v) {
        int vSum = 0;
        for (int i = 0; i < v.length; i++) {
            vSum += v[i];
        }
        return vSum;
    }

    public static void main(String[] args) {
        int[][] a = { { 1, 2, 3 }, { 3, 2, 1 }, null };
        System.out.println(allRowSumsEqual(a));
        int[][] b = { null, null, null };
        System.out.println(allRowSumsEqual(b));
    }
}

答案 3 :(得分:0)

您如何看待这个解决方案:

public static boolean allRowSumsEqual(int[][] m) {

    if(m == null) { return false; }

    int sum = 0;

    for(int i = 0; i < m.length; i++) {

        int temp = 0;

        if(m[i] == null) { continue; }

        for(int j = 0; j < m[i].length; j++) {
            temp += m[i][j];
        }

        if(i == 0) {  //is the first row
            sum = temp;
        }
        else if(sum != temp) { 
            return false;
        }
    }

    return true;
}