2016-03-03 2 views
2

Так что я хотел бы создать метод, который из двух заданных массивов, он выводит один с наименьшей длины, но метод всегда просит для возвращения за пределами если заявленияНаименьшая длина массива

public static int[][] SmallestArray(int[][] A, int[][] B){ 
    if(A.length < B.length){ 
     if(A[0].length <B[0].length) 
      return A; 
    } 
    else if(B.length < A.length){ 
     if(B[0].length <A[0].length) 
      return B; 
    } 
} 
+9

Вы забыли случай B.length == a.length – matoni

+3

Вы не охватывают все возможные пути выполнения. Все непустые методы требуют пути к оператору return –

+0

Это потому, что все еще остаются случаи, когда ни одно из условий не является истинным. Затем вы попадаете в ветвь, которая не покрывается, но метод все равно должен что-то вернуть. Например: что происходит, когда '' A'' и '' B'' имеют одинаковую длину? – f1sh

ответ

0

Есть непокрытые пути в вашем коде. Это означает, что есть случаи, когда выполнение вашего метода заканчивается, не встретив инструкции return. Но так как вы объявили, что ваш метод возвращает и int[][], это должно быть возвращено где-то.

Вот пути без возврата заявления:

public static int[][] SmallestArray(int[][] A, int[][] B){ 
    if(A.length < B.length){ 
     if(A[0].length <B[0].length){ 
      return A; 
     } 
     //possibly here 
    } 
    else if(B.length < A.length){ 
     if(B[0].length <A[0].length){ 
      return B; 
     } 
     //possibly here 
    } 
    //definitely here! 
    //in this case A and B have the same length. 
    //You have return an int[][], which one will it be? 
} 
+2

Нет, они, возможно, отсутствуют. Возможно, будет нормально провалиться и обработать все остальные случаи одинаково. –

+0

@ cricket_007 Вам не нужны '' возможно' 'ы. '' Определенно'' будет выполнен как резерв для всех этих случаев. – f1sh

+0

Ну, для компиляции, да, это имеет смысл. Для логики кода я бы сказал, что OP должен включать эти возвращения, хотя –

0

Некоторые случаи, не охватываемые кода.

Например: (B.length == A.length) не управляется.

Вы должны ввести некоторые другие утверждения.

public static int[][] SmallestArray(int[][] A, int[][] B){ 
    if(A.length < B.length){ 
     if(A[0].length <B[0].length){ 
      return A; 
     } else { 
      // uncovered case 
     } 
    } 
    else if(B.length < A.length){ 
     if(B[0].length <A[0].length){ 
      return B; 
     } else { 
      // uncovered case 
     } 
    } 
    else { 
     // uncovered case 
    } 
} 

Хорошей практикой является наличие только одного оператора возврата в конце вашего метода.

public static int[][] SmallestArray(int[][] A, int[][] B){ 

    int[][] result = null ; 
    // do the job 
    return result; 
} 
+1

Это практически дубликат другого ответа –

0

Вы нарушаете парадигму if else.

Верхний уровень if else должен вернуть значение, которое не в вашем случае. Вы возвращаете значение из условия sub (еще одно условие if) внутри вашего условия верхнего уровня, а компилятор ожидает тип возврата либо из состояния верхнего уровня, либо из конца метода.

вы можете достичь его либо способами:

 
1.)
public static int[][] SmallestArray(int[][] A, int[][] B){ if(A.length < B.length){ if(A[0].length < B[0].length) return A; } else if(B.length < A.length){ if(B[0].length < A[0].length) return B; } return null;
}
2.)
public static int[][] SmallestArray(int[][] A, int[][] B){ if(A.length < B.length){ if(A[0].length < B[0].length) return A; return B; // return from top level if } else if(B.length < A.length){ if(B[0].length < A[0].length) return B; return A; // return from top level else } return null;
}

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