Аннотация и исключение

Я читаю файл журнала ошибок и проверяю, относится ли строка ошибки к аннотации. Я пробовал работать с документом, но безрезультатно, но может ли аннотация (или пользовательская аннотация) вызвать исключение?

Большое спасибо.

can the annotation (or a custom annotation) throw an exception? -> он может иметь заявления?
ernest_k 11.01.2019 12:41

Аннотации не могут, обработчик аннотаций может.

J-Alex 11.01.2019 12:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 391
3

Ответы 3

Аннотации не выполняются, поэтому они не могут вызывать исключение.

Аннотации можно обрабатывать двумя способами:

  • во время компиляции: они фактически приводят к тому, что другой / дополнительный байтовый код записывается в файлы классов
  • во время выполнения: обычно какая-то структура проверяет присутствие аннотации для метода / класса / ..., чтобы затем запускать другой код, в зависимости от того, находится ли эта конкретная аннотация на месте или нет

Другими словами: сама аннотация не похожа ни на какой реальный код, это просто «маркер». Но, конечно, чтобы сделать что-то полезное (особенно во время выполнения), вероятно, есть какой-то код, который делает что-то другое, когда присутствуют аннотации. И, конечно же, этот код может генерировать исключения. Но в этом случае вы должны получить трассировку стека и, надеюсь, полезные сообщения.

С этой точки зрения: сама аннотация не может вызвать исключение, потому что сама аннотация не похожа на то, что можно «выполнить». Или украсть формулировку из другого ответа J-Alex: аннотации могут вызывать исключения, но они не могут быть «источником».

Фактически, если они отбрасываются компиляторами, имеющими RetentionPolicy.SOURCE, тремя способами, единственный способ обработать их - это читать исходные коды.

J-Alex 11.01.2019 13:29

@ J-Alex Это еще случай "один". Аннотация обрабатывается во время компиляции. В отношении этого аспекта не имеет значения, добавлена ​​ли аннотация сам к скомпилированному файлу класса или нет.

GhostCat 11.01.2019 13:30

Аннотация может быть ПРИЧИНОЙ исключения, но не может ее выбросить, поэтому это просто маркер для процессора аннотаций.

Это фиктивный пример того, как Annotation может быть причиной Exception:

public class Main {

    @ValidNumber
    public String number = "1234X5";

    public static void main(String[] args) {
        new AnnotationProcessor().scan();
    }
}

class AnnotationProcessor {
    private String regex = "\\d+";

    void scan() {
        Main m = new Main();
        for (Field field : m.getClass().getDeclaredFields()) {
            ValidNumber annotation = field.getAnnotation(ValidNumber.class);
            if (annotation != null)
                process(m, field);
        }
    }

    void process(Object target, Field field) {
        try {
            Object o = field.get(target);
            if (!o.toString().matches(regex))
                throw new IllegalStateException("Wrong number in the class " + target);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface ValidNumber {
}

Вывод:

Exception in thread "main" java.lang.IllegalStateException: Wrong number in the class com.test.Main@5c3bd550
    at com.test.AnnotationProcessor.process(Main.java:32)
    at com.test.AnnotationProcessor.scan(Main.java:24)
    at com.test.Main.main(Main.java:12)

Это пример того, как обрабатывать аннотацию RUNTIME.

Хороший подход к формулировке: разница между источник и причина исключения.

GhostCat 11.01.2019 13:28

Другие вопросы по теме