注释和异常

时间:2019-01-11 11:37:42

标签: java annotations

我正在读取错误日志文件,并且正在检查错误行是否引用了注释。我尝试了文档但没有结果,但是注释(或自定义注释)会抛出异常吗?

非常感谢。

3 个答案:

答案 0 :(得分:3)

注释不会执行,因此它们不会引发异常。

答案 1 :(得分:3)

注释可以通过两种方式处理:

  • 在编译时:它们实际上导致将不同/其他字节代码写入类文件
  • 在运行时:通常,某种框架会检查方法/类/ ...上注释的存在性,然后运行不同的代码,具体取决于该特定注释是否到位是否

换句话说:注释本身与任何真实代码都不相似,它只是一个“标记”。但是,当然,为了做一些有用的事情(尤其是在运行时),可能存在一些注释存在时会执行不同操作的代码。当然,该代码可以引发异常。但是在这种情况下,您应该会收到堆栈跟踪和希望有用的消息。

从这个角度来看:注释本身不能引发异常,因为注释本身与可以“执行”的东西不相似。或者从J-Alex的其他答案中窃取措辞:注解可能会导致异常,但它们不能成为“来源”。

答案 2 :(得分:2)

注释可能是引起异常的原因,但不能抛出该异常,因此它只是注释处理器的标记。

这是一个虚拟的示例,如何将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注释的示例。