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




Аннотации не выполняются, поэтому они не могут вызывать исключение.
Аннотации можно обрабатывать двумя способами:
Другими словами: сама аннотация не похожа ни на какой реальный код, это просто «маркер». Но, конечно, чтобы сделать что-то полезное (особенно во время выполнения), вероятно, есть какой-то код, который делает что-то другое, когда присутствуют аннотации. И, конечно же, этот код может генерировать исключения. Но в этом случае вы должны получить трассировку стека и, надеюсь, полезные сообщения.
С этой точки зрения: сама аннотация не может вызвать исключение, потому что сама аннотация не похожа на то, что можно «выполнить». Или украсть формулировку из другого ответа J-Alex: аннотации могут вызывать исключения, но они не могут быть «источником».
Фактически, если они отбрасываются компиляторами, имеющими RetentionPolicy.SOURCE, тремя способами, единственный способ обработать их - это читать исходные коды.
@ J-Alex Это еще случай "один". Аннотация обрабатывается во время компиляции. В отношении этого аспекта не имеет значения, добавлена ли аннотация сам к скомпилированному файлу класса или нет.
Аннотация может быть ПРИЧИНОЙ исключения, но не может ее выбросить, поэтому это просто маркер для процессора аннотаций.
Это фиктивный пример того, как 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.
Хороший подход к формулировке: разница между источник и причина исключения.
can the annotation (or a custom annotation) throw an exception?-> он может иметь заявления?