2016-11-20 3 views
0

У меня есть эти два метода:Java генериков с исключениями производства ошибки компиляции времени

private static <T extends Throwable> void methodWithExceptionGeneric(final T t) throws T { 
    throw t; 
} 

private static void methodWithExceptionNonGeneric(final Throwable t) throws Throwable { 
    throw t; 
} 

Когда я называю эти методы, как так:

methodWithExceptionGeneric(new IllegalArgumentException()); 
methodWithExceptionNonGeneric(new IllegalArgumentException()); // compile time error 

Я получаю компиляции ошибки времени в не общий метод говоря, что у меня есть необработанное исключение в моем основном методе, и мне нужно либо объявить инструкцию throw, либо уловить исключение.

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

+0

Знаете ли вы о проверенных и непроверенных исключениях? Что такое 'IllegalArgumentException'? –

+0

@SotiriosDelimanolis Я не знаю – Ogen

+0

@Ogen, а затем google it, проверьте документы: http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html и убедитесь, что он расширяет 'java.lang.RuntimeException' – alfasin

ответ

1

Причины довольно прост:
IllegalArgumentException является RuntimeException, что означает, что неконтролируемое исключение. Вы можете поймать его, но вам этого не нужно. Поскольку общий метод генерирует только IllegalArgumentException по его спецификации, компилятор не будет жаловаться (исключено исключение).

Метод, не имеющий общих признаков, с другой стороны, задает значение для любого Throwable, что означает, что он также может выдавать исключенные исключения (и ошибки), которые необходимо обрабатывать.

Это становится легко понять, когда вы пытаетесь понять, что происходит с общим способом:

methodWithExceptionGeneric(new IllegalArgumentException()); 

эквивалентно

methodWithExceptionGeneric<IllegalArgumentException>(new IllegalArgumentException()); 

Когда мы посмотрим на определение

private static <T extends Throwable> void methodWithExceptionGeneric(final T t) throws T ... 

превращается в

private static <IllegalArgumentException> void methodWithExceptionGeneric(IllegalArgumentException) throws IllegalArgumentException ... 

Таким образом, methodWithExceptionGeneric(new IllegalArgumentException()); может выдавать только IllegalArgumentException или любые другие непроверенные Exception за определение. Неоригинальный метод, с другой стороны, может сбрасывать любые Exception, будь то проверенные или непроверенные, и поэтому их нужно вызывать из try-catch -block, обрабатывая все, что бросает метод.

+0

Так как мне нужно изменить не общий метод, чтобы ошибка времени компиляции исчезла? Я изменил тип параметра на 'RuntimeException', так что это неконтролируемое исключение и, предположительно, мне не нужно его ловить, но компилятор все еще жалуется. – Ogen

+1

@Ogen Жалуется, потому что внутри метода вы бросаете 't', который является« Throwable », который является проверенным исключением. –

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