Подтвердить что ты не робот

Спецификация исключения

Является ли спецификация исключения частью подписи метода? Я имею в виду:

public void someMethod(String myString) throws IOException

является 'throws IOException' частью сигнатуры этого метода?

Спасибо

4b9b3361

Ответ 1

В ответ на ответ Jon Skeet и в ответ на комментарий

@Jon Skeet Почему тогда я не могу открыть public void run(), чтобы исключить IOException в классе, который реализует Runnable? - Знать, что я знаю тебя.

В разделе 8.4.6 Спецификации языка Java (3-е изд.) говорится:

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

Более точно, предположим, что B является классом или интерфейсом, а A является суперклассом или суперинтерфейсом B, а декларация метода n в B переопределяет или скрывает объявление метода m в A. Если n имеет предложение throws в котором упоминаются все проверенные типы исключений, тогда m должно иметь предложение throws, и для каждого проверенного типа исключения, указанного в предложении throws n, тот же класс исключения или один из его супертипов должен произойти при стирании throws положение m; в противном случае возникает ошибка времени компиляции.

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

Ответ 2

Нет. Из раздел 8.4.2 Специфика языка Java:

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

Два объявления метода или конструктора M и N имеют одинаковые типы аргументов если все следующие условия держать:

Они имеют одинаковое количество формальных параметры (возможно, ноль). такое же количество параметров типа (возможно, ноль). Пусть формальные параметры типа M и пусть  быть формальным типом параметры N. После переименования каждого появление Bi в N-типе Ai границы соответствующего типа переменные и типы аргументов M и N одинаковы.

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

Кроме того, из документ Божо цитирует:

Определение: две составляющие описание метода включает метод подпись - имя метода и типы параметров.

Нет упоминаний об исключениях...

EDIT: Что касается переопределения метода (или реализации интерфейса), из раздел 8.4.8.3:

Объявление метода не должно иметь бросает условие, что конфликты (§8.4.6) с любым способом, который он переопределяет или скрывает; в противном случае ошибка времени компиляции.