2015-07-11 5 views
-1

Я реализую постоянную размерную очередь в Java, которая использует постоянный размер ArrayList в качестве основного контейнера, где мой метод front() должен возвращать передний элемент очереди.Возврат, только если не выбрано Исключение

public T front(){ 


     try{ 
      if(isEmpty()) 
       throw new Exception("Queue is Empty- can't return Front element."); 
      return arrayList.get(frontIndex); 

     }catch (Exception e){ 
      System.out.println(e); 
     } 

    } 

При кодировании в вышеописанном способе, я хочу фронт() возвращать значение, только если нет не будет сгенерировано исключение, однако, как ожидается, компилятор показать мне «Отсутствует оператор возврата.» Итак, можно ли каким-либо образом вернуть функцию, только если не выбрано Exception.

+0

Если метод имеет тип возврата, отличный от '' void', вы * имеете *, чтобы либо вернуть значение, либо выбросить исключение. Альтернативы нет. Что вы хотите сделать из этих двух вариантов? –

ответ

3

Поскольку вы улавливаете исключение в коде, компилятор показывает, что отсутствует ошибка оператора return.

Вы можете реализовать функцию:

public T front() throws Exception { 

    if(isEmpty()) { 
     throw new Exception("Queue is Empty- can't return Front element."); 
    } 

    return arrayList.get(frontIndex); 
} 

и, наконец, обработать исключение при вызове функции/клиент

0

Почему вы используете исключение вообще, если вы его поймаете? Вы должны либо вернуть T, либо выбросить исключение. Но метод не генерирует исключения, поскольку вы его ловите. Не проще ли это сделать:

public T front() throws SomeException{ // if SomeException is checked you need to declare it 
     if(isEmpty()) 
      throw new SomeException("Queue is Empty- can't return Front element."); 
     return arrayList.get(frontIndex); 
    } 

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

+1

Исключения должны быть пойманы, он должен выбросить ошибку – ceph3us

+0

Исключения могут быть пойманы, но обычно они пойманы вызывающей стороной метода, а не самим методом – user140547

+0

Что отличает исключение от ошибки? Ошибка никогда не должна быть поймана – ceph3us

1

Я хочу фронт(), чтобы вернуть значение, только если исключение не брошено

Риторический вопрос: Что вы хотите вернуться, если исключение?

В этом проблема. Вы объявили front() как возвращающее что-то (пример T). Это означает, что есть два соответствующие способ Для завершения вызова front():

  • может оканчивается нормально, возвращая то, что соответствует типу T.

  • Это может привести к ненормальному завершению путем исключения исключенного исключения.

Вы не можете вернуть «ничего», потому что front() должен вернуть значение.

Вы не можете выбросить исключенное исключение (например, Exception), потому что front() не объявляется как исключающее исключения.


Так что вы можете сделать?

  • Вы можете изменить сигнатуру метода, так что SomeException брошено, где SomeException спускается с Exception. (Бросание Exception - очень плохая идея ...)

  • Вы можете изменить throw new Exception к throw new SomeException, где SomeException происходит от RuntimeException.

  • Вы можете вернуть null, считая, что T является ссылочным типом. (Это будет, если T является параметром типа.)


1 - На самом деле, есть несколько других способов, но они не являются полезными в этом контексте. Например, вы можете позвонить System.exit(int) и завершить JVM. (И есть способы структурирования кода, так что вам не нужен (резервный) return или throw после exit вызова Hint:. Зацикливания не нужно возвращать.)

+0

Даже если вы вызываете 'System.exit (int)', вам все равно нужно вернуть значение или выбросить исключение; компилятор не знает, что поток программы прекращается после вызова 'System.exit (int)'. –

+0

Риторический Я могу вернуть что-либо типа T или null, даже если Исключение будет выбрано – ceph3us

+0

спасибо, ваш риторический вопрос дал мне понять, я ценю это! – charany1

0

этот «пример» показывает возможность, когда и может бросить значение исключения и возврата

private boolean throwExReturnValue() throws NullPointerException { 

    try { 

     throw new NullPointerException("HAHA"); 
    } 

    finally { 

     return true; 
    } 
} 

private void ExceptionHanler() { 

    boolean myEx; 

    try { 

     myEx = throwExReturnValue(); 

     /** code here will still execute & myEx will have value = true */ 

    } catch (Exception ex) { 

     /** will execute or not (depending on VM) even we throwed an exception */ 

    } 

    /** code will still execute */ 

} 

EDIT:

я попытался это с двумя различными VM и к моему удивлению, один бросает Второе исключение пропускает блок catch и выполняет код, поэтому он зависит от реализации виртуальной машины.

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