2017-02-17 13 views
0

У меня есть этот метод, который принимает два экземпляра двумерных массивов для их объединения и хранения суммы в новом массиве, два массива должны иметь одинаковый размер, например (те же номера строк и столбцов) если он не должен вызывать исключение, которое я определил. мой метод бросает исключение только в том случае, если первый массив имеет различное количество строк, а не столбцы, например, исключение выбрасывается только при передаче этих массивов: a [4] [4] b [5] [4], но не эти массивы: a [4] [5] b [4] [5], может кто-нибудь объяснить, что происходит? и я правильно выбрал исключение?Исключения JAVA с массивами

public int[][] add(int[][] a, int[][] b) throws IncompatibleArgumentsException { 
    int[][] sum = new int[a.length][b.length]; 

    if (a.length == b.length) { 
     System.out.println("The Sum of the arrays is: "); 
     System.out.println(" --------------- "); 
     for (int row = 0; row < a.length; row++) { 
      for (int col = 0; col < b.length; col++) { 
       sum[row][col] = a[row][col] + b[row][col]; 

       System.out.println(" | " + a[row][col] + " + " + b[row][col] + " = " + sum[row][col] + " | "); 
       System.out.println(" --------------- "); 
      } 
     } 
    } else { 
     throw new IncompatibleArgumentsException("Arrays have different size"); 
    } 

    return sum; 
} 

и это, как я вызова метода:

public Implementation() { 

    int[][] x = new int[1][1]; 
    x[0][0] = 1; 

    int[][] y = new int[1][2]; 
    y[0][0] = 1; 
    y[0][1] = 3; 

    add(x, y); 
} 
+0

Ну, вы просто генерируете исключение, если a.length! = A [0] .length. Поэтому вы даже не сравниваете размер двух внешних массивов. Только если число строк первого массива равно числу столбцов его первой строки. Вам нужно сравнить количество строк двух массивов и количество элементов всех строк из двух массивов. Я также не понимаю, почему массив результатов инициализируется как новый int [a.length] [b.length]. –

+0

@controlaltdel, но его возврат суммы, вот результат консоли: сумма массивов: --------------- | 1 + 1 = 2 | --------------- – Khaled

+0

@ Khhaled Прошу прощения. Я думал, что «второй случай не должен вызывать исключения ...», но это не то, что я написал. В любом случае это похоже на то, что вы нашли – ControlAltDel

ответ

1

У вас есть неправильный чек. То, что вы должны делать прямо на вершине:

if (a.length != b.length || a[0].length != b[0].length) { 
    throw new IncompatibleArgumentsException(...); 
} 
+0

спасибо, сэр, что сделал трюк. Еще один вопрос вы можете посоветовать, как я могу сделать массивы, которые я передаю более динамичными, например, передать несколько столбцов и строк и установить их значения с помощью цикла for или любого лучшего подхода? – Khaled

+0

@ Khhaled, вы можете разместить новый вопрос – FSm

0

«a.length» дает количество строк, по существу, 2-d массив представляет собой массив из 1-й массивов, так a.'length»просто укажите количество 1-мерных массивов в 'a'. Чтобы сопоставить количество столбцов, вам нужно узнать, сколько элементов в отдельных 1-мерных массивах a, следовательно a[0].length (где a [0] = 0-й 1-й массив в a) даст вам номер столбцов.