2016-11-23 5 views
0

Я пишу программу, которая демонстрирует использование методов наследования и переопределения. Я хочу создать оператор if, который включает использование исключения. Я включил исключение в мой оператор if, но когда я пишу «исключение бросков» в начале метода, я получаю сообщение об ошибке n, в котором говорится, что «« переопределенный метод не выбрасывает исключение ». Вот код:«переопределенный метод не выбрасывает исключение»?

Sub класса

public class Carnivore extends Animal 
{ 
    public Food eat(Food x) throws Exception 
    { 
     if (x.equals("Plants")) { 
       throw new Exception("Carnivores only eat meat!"); 
      } else { 
       return x; 
      } 

    } 
    public void makeNoise() 
    { 
     noise = null; 
    } 
    public String getNoise() 
    { 
     return noise; 
    } 
} 

Супер класс

abstract public class Animal { 

String name; 
int age; 
String noise; 

abstract public void makeNoise(); 

public String getName() { 
     return name; 
    } 

    public void setName(String newName) { 
     name = newName; 
    } 

abstract public Food eat(Food x); 

} 

Любая помощь на том, как переписать это так, что исключение должным образом оценена , благодаря.

+1

Либо добавить броски пункта суперкласса или удалить его из подкласса. – chrylis

+0

есть слишком много релевантных вопросов о stackoverflow как [Исключение и Наследование в Java] (http://stackoverflow.com/questions/12978798/exception-and-inheritance-in-java) –

ответ

-1

Поскольку вы должны быть в состоянии безопасно заменить любой подкласс для экземпляра супертипа, вы не можете добавлять проверенные исключения, которые не относятся к переопределенным методам. В этом случае вы можете либо добавить throws Exception в свой метод Animal#eat(Food), либо удалить его с Carnivore.

Однако, это почти всегда плохая идея, чтобы на самом деле бросить просто класс Exception; есть много отдельных классов, которые несут в себе смысл. В вашем случае вы должны выбросить IllegalArgumentException, который является правильным типом при сбое вызова метода, поскольку предоставленные аргументы не подходят. Это неконтролируемое исключение и не требует предложения бросков.

Обратите внимание, что x.equals("Plants") почти наверняка неправильный подход для проверки. Либо укажите Food с методом type(), который возвращает значение перечисления, поэтому x.type() == Foods.PLANTS, или предоставить логический метод isPlant(), поэтому x.isPlant().

-1

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

Поскольку вы не определили, что «Исключение» может быть выброшено в ваш суперкласс. Carnivore также не может исключать исключение. Поэтому, если вы предполагаете метод, это дизайн, чтобы в конечном итоге создать исключение - определите его и в своем суперклассе.

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

Пример:

public Food eat(Food x) { 
    if (x.equals("Plants")) { 
     throw new IllegalArgumentException("Carnivores only eat meat!"); 
    } else { 
     return x; 
    } 
    } 
+0

* Проверенные исключения являются частью сигнатуры метода в Java "*: https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2 – Tom

0

В соответствии с вашим кодом вы упоминали, что осуществимый способ съесть (Пищевое х) может выбросить исключение, которое java.lang.Exception. Это java.lang.Exception - это класс Super всех классов исключений в иерархии исключений. Таким образом, это исключает как проверенное, так и исключенное исключение. В соответствии с переопределяющим правилом, если метод Super class не генерирует никаких исключений, в то же время переопределяя метод в дочернем классе, вы можете бросить RunTimeExceptions.

Так в соответствии с вашим кодом метода класса ужин является

абстрактного общественного питания едят (Food х);

выше метод не выбрасывает никаких исключений

поэтому пока перекрывая его в дочернем классе, если вы пишете ниже код, который вы получите во время компиляции Exception

общественного питания ест (Food х) бросает исключение { // делаем вашу работу }

, но это можно сделать, как показано ниже.

общественного питания едят (Food х) бросает RuntimeException { }

Надеюсь, вы получили ответ.

Спасибо, Basanta

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