2013-12-22 4 views
0

я имею эту программу в JavaЛюбое исключение выбрано здесь?

public class PolyTest 
{ 
    public static void main(String... arg) 
    { 
     Animal a = new Animal(); 
     Horse b = new Horse(); 
     Animal c = new Horse(); 

     a.eat(); 
     b.eat(); 
     c.eat(); 
    } 
} 

class Animal 
{ 
    public void eat() throws IndexOutOfBoundsException 
    { 
     System.out.println("Animal Eating"); 
    } 
} 
class Horse extends Animal 
{ 
    @Override 
    public void eat() 
    { 
     System.out.println("Horse Eating"); 
    } 
} 

сейчас, удивительно это работает без каких-либо ошибок в-несмотря на отсутствие попытки поймать блок или брошенной в пункте основного метода.
1. Почему a.eat() не дает никаких ошибок в основном методе?
2. Когда я меняю IndexOutOfBoundsException на просто Exception, это ошибка времени компиляции. Зачем ?

прочитайте что-нибудь об этом в руководстве по экзаменам SCJP в kathy sierra, но не смогли понять концепцию здесь.

+0

IndexOutOfBoundsException - исключение RuntimeException, поэтому для него не требуется особая обработка. – wxyz

+0

IndexOutOfBoundsException - исключение RuntimeException. См. Http://stackoverflow.com/questions/2190161/difference-between-java-lang-runtimeexception-and-java-lang-exception. – jarmod

+0

Возможный дубликат [Отсутствует ошибка компиляции в исключениях времени выполнения. почему?] (http://stackoverflow.com/questions/6150609/no-compilation-error-on-runtime-exceptions-why) – Mat

ответ

3

Вам не нужно ловить IndexOutOfBoundsException, это RuntimeException.

Изучить типы Exceptions

0

IndexOutOfBoundsException является unchecked RuntimeException, поэтому вам не требуется, чтобы справиться с этим.

1

Не все исключения должны обрабатываться программистом. Некоторые из них просто должны раздавить приложение, потому что они представляют проблему с кодом, а не с помощью ввода. Такими исключениями являются RuntimeExceptions. Наиболее известным является NullPointerException, который указывает, что некоторые переменные не содержат ссылок на объекты, но все еще используются для вызова методов этого объекта.

Теперь взгляните на IndexOutOfBoundsException documentation, и вы увидите, что он расширяет RuntimeException, что означает, что вам не нужно (но вы можете) поймать его. Вот почему ваш код компилируется без проблем.

0
  1. Почему, на ваш взгляд, это должно дать ошибку?
  2. IndexOutOfBoundsException является неконтролируемым исключением поэтому вы не должны объявить в throws списке методы магистрали, Exception является проверяемым исключением, которое дает компиляцию ошибку времени, потому что вы не объявляете его в throws разделе в основном способом и вы не используете блок try/catch.
3

Основная путаница в различении фактически метания исключение и только объявляя его. Путаница вызвана неудачной «особенностью» Java в проверенных исключениях, потому что вызов метода, который только объявляет, чтобы выбросить исключенное исключение, заставит вас что-то сделать с этим , независимо от того, может ли этот метод действительно генерировать исключение.

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

0

Вы должны твердо понимать, почему вы не должны улавливать RuntimeException. Поскольку этот тип исключения указывает вашу ошибку программирования. Обычно этот тип исключения не должен отображаться. Например, если у вас есть программа, в которой пользователь вводит индекс чего-либо в вашем массиве, вы должны сначала проверить введенный пользователем данных и только затем передать эти данные программе. Если вы не отметили, и пользователь ввел -1, вы получите исключение во время выполнения, которое укажет на вашу ошибку программирования.

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