2009-11-08 4 views
1

У меня есть следующий интерфейс заявление:Подпись метода, объявленная как броски Исключение; реализовано как бросает подкласс Exception

public interface SomeInterface { 

    void someMethod() throws Exception; 

} 

я использую третью сторону для создания реализации этого класса (JavaCC - для любознательного)

Сформированные класс выглядит наивно, как это:

public class SomeClass implements SomeInterface { 

    public void someMethod() throws SomeException { 

    // Does something 

    } 
} 

Где SomeException это конечно подкласс Exception.

(Нет) удивительно код не скомпилирован.

У кого-нибудь есть данные, касающиеся этого?

Спасибо!

EDIT:

переименован метод SomeMethod() к someMethod().

Это была опечатка мой ... (извините)

EDIT # 2:

К сожалению все - огромная ошибка моя. Написание этого примера заставило меня разбить код. Я не заметил, что ошибка была в другом месте, а не подписи.

То «магии», от выполнения компиляции и пользовательской нагрузки класса ...

+0

"любой вход?" это не вопрос окончательного ответа. –

+0

Скомпилированный код будет опубликован. Можете ли вы воспроизвести проблему с этим примером кода? – Yishai

+1

Огромная ошибка. Поскольку мне пришлось разбить код для этого примера, я не заметил, что проблема была в другом месте ... Действительно извините за это !!!! – Yaneeve

ответ

1

Это не компилируется, потому что имена методов не совпадают (проверьте ограничения на S/SomeMethod)

+0

Но если вы исправите это, он должен скомпилировать штраф. –

+0

только опечатка в StackOverflow ... – Yaneeve

+2

Но это скомпилирует: import java.io.*; интерфейс SomeInterface { \t void someMethod() throws Exception; } класс SomeClass реализует SomeInterface { общественного недействительными SomeMethod() бросает IOException { // Есть ли что-то }} Таким образом, проблема должна быть что-то еще ... –

1

Случай важен в Java. Ваш интерфейс говорит someMethod и ваш класс говорит SomeMethod.

+0

просто опечатка в StackOverflow. .. – Yaneeve

0

Почему ваш метод интерфейса выбрасывает исключение? Это почти всегда неправильно. Исключение - это только базовый тип, от которого все зависит; он не предназначен для использования таким образом.

+0

Из-за проблем с загрузкой классов ... Код, который генерирует класс, также генерирует исключение, которое будет загружаться в другой загрузчик классов, чем интерфейс. Я не могу, насколько мне известно, использовать интерфейс одного и того же типа исключения, поскольку он никогда не будет прежним. Это немного яснее? – Yaneeve

+0

Иногда есть причина для этого: в нем говорится, что метод может генерировать исключение, зависящее от реализации. Например, рассмотрим механизм сохранения, который может либо записываться в базу данных, либо в файл. Один бросает SQLException, другой бросает IOException. В любом случае приложение должно поймать исключение, когда сбой записи, и предпринять некоторые действия (от простого переноса в RuntimeException/subclass до создания настраиваемой страницы/диалога ошибки). – kdgregory

+0

Что не так в методе металирования интерфейса? Если реализация должна быть брошена, предлагаете ли вы сбросить флажок, который будет недокументирован интерфейсом? Это казалось бы совершенно неправильным. – user443854

0

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