Ошибка в операторе if программы односвязного списка - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над SinglyLinkedList программой, в которой я написал все методы.Существует метод deleteAtGiven(int t), который генерирует исключение IndexOutOfBoundsException, если переменная t меньше 0 или t больше или равна размеру, но выдает мне ошибку оператора Rereachable.

Я попытался записать его в оператор else-if и инвертировать оператор else = if, но он не работает.

Вот мой код

public E deleteAtGiven(int t){
    if(isEmpty()) return null;
    throw new IndexOutOfBoundsException("List is Empty");
    else if (t<0 ||t>=size()){ 
    throw new IndexOutOfBoundsException("Invalid Position");
   }
}

Это должно вызвать исключение.

Ответы [ 4 ]

0 голосов
/ 26 сентября 2019

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

    public E deleteAtGiven(int t) {
    if (isEmpty())
        throw new IndexOutOfBoundsException("List is Empty");
    else if (t < 0 || t >= size()) 
        throw new IndexOutOfBoundsException("Invalid Position");

    else return null;
}

, и, когда он пройдет все случаи, вы вернете ноль или все, что захотите, если не пройдете, он запустит исключение

0 голосов
/ 26 сентября 2019

Если мы изменим разрывы строк и отступы вашего кода в соответствии со стандартами Java, я подозреваю, что вы увидите, в чем проблема:

public E deleteAtGiven(int t){
    if(isEmpty()) 
        return null;
    throw new IndexOutOfBoundsException("List is Empty");
    else if (t<0 ||t>=size()){ 
        throw new IndexOutOfBoundsException("Invalid Position");
   }
}

Директива throw не контролируется оператором if,Вместо этого бросок происходит каждый раз, когда вызывается метод, независимо от того, запущен оператор if или нет.Это делает весь код, следующий за броском, недоступным.

0 голосов
/ 26 сентября 2019

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

public E deleteAtGiven(int t){
    if(isEmpty())
    throw new IndexOutOfBoundsException("List is Empty");
    else if (t<0 ||t>=size()) 
          throw new IndexOutOfBoundsException("Invalid Position");
}
0 голосов
/ 26 сентября 2019
public E deleteAtGiven(int t){
        if(isEmpty()) return null;
        throw new IndexOutOfBoundsException("List is Empty");
        else if (t<0 ||t>=size()) 
        throw new IndexOutOfBoundsException("Invalid Position");
         }

В приведенном выше коде isEmpty() проверяет, является ли связанный список пустым или нет.Если это так, он возвращает значение null.
Если связанный список не пуст, тогда выполняется оператор чуть ниже условия if.
Здесь он выдает IndexOutOfBoundsException.
Следовательно, код виначе, если part никогда не выполнится, в результате чего операторы чуть ниже оператора throw будут недоступны.

В соответствии с моим пониманием того, что вы пытаетесь сделать, вам придется сделать что-то вроде этого:

public E deleteAtGiven(int t){
        if(isEmpty()) {
        throw new IndexOutOfBoundsException("List is Empty");
        }
        else if (t<0 ||t>=size()){
        throw new IndexOutOfBoundsException("Invalid Position");
        }else{
           // rest logic resides here.
        }
     }

Объяснение:
Если связанный список уже пуст, просто выведите пустое исключение.В противном случае, если индекс элемента недопустим, генерируется исключение «Неверная позиция».

...