注解的理解

  1. 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
  2. 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
  3. 在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角色,

例如用来配置应用程序的任何切面,代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等

基本的 Annotation 介绍

使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元 素 三个基本的 Annotation:

  1. @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
  2. @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
  3. @SuppressWarnings: 抑制编译器警告

@Override 注解

@Override 使用说明

  1. @Override表示指定重写父类的方法(从编译层面验证)如果父类没有fly方法,则会报错

  2. 如果不写@Override注解,而父类仍有 public void fly(){},仍然构成重写

  3. @Override只能修饰方法,不能修饰其它类,包,属性等等

  4. 查看@Override注解源码为@Target(ElementType.METHOD),说明只能修饰方法

  5. @Targe是修饰注解的注解,称为元注解,

@Deprecated 注解

  1. 用于表示某个程序元素(类,方法等)已过时

  2. 可以修饰方法,类,字段,包,参数等等

  3. @Target(value={CONSTRUCTOR, FIELD, LOCAL VARIABLE, METHOD,PACKAGE, PARAMETER, TYPE})

  4. @Deprecated的作用可以做到新旧版本的兼容和过渡

@SuppressWarnings 注解

  1. 当我们不希望看到这些警告的时候,可以使用 SuppressWarnings 注解来抑制警告信息
  2. 在{“”} 中,可以写入你希望抑制(不显示)警告信息

可以指定的警告类型有

  1. all,抑制所有警告
  2. boxing,抑制与封装/拆装作业相关的警告
  3. cast,抑制与强制转型作业相关的警告
  4. dep-ann,抑制与淘汰注释相关的警告
  5. deprecation,抑制与淘汰的相关警告
  6. fallthrough,抑制与 switch 陈述式中遗漏 break 相关的警告
  7. finally,抑制与未传回 finally 区块相关的警告
  8. hiding,抑制与隐藏变数的区域变数相关的警告
  9. incomplete-switch,抑制与 switch 陈述式(enum case)中遗漏项目相关的警告
  10. javadoc,抑制与 javadoc 相关的警
  11. nls,抑制与非 nls 字串文字相关的警告
  12. null,抑制与空值分析相关的警告
  13. rawtypes,抑制与使用 raw 类型相关的警告(传参时没有指定泛型错误警告)
  14. resource,抑制与使用 Closeable 类型的资源相关的警告
  15. restriction,抑制与使用不建议或禁止参照相关的警告
  16. serial,抑制与可序列化的类别遗漏 serialVersionUID 栏位相关的警告
  17. static-access,抑制与静态存取不正确相关的警告
  18. static-method,抑制与可能宣告为 static 的方法相关的警告
  19. super,抑制与置换方法相关但不含 super 呼叫的警告
  20. synthetic-access,抑制与内部类别的存取未最佳化相关的警告
  21. sync-override,抑制因为置换同步方法而遗漏同步化的警告
  22. unchecked,抑制与未检查的作业相关的警告
  23. unqualified-field-access,抑制与栏位存取不合格相关的警告
  24. unused,抑制与未用的程式码及停用的程式码相关的警告

关于 SuppressWarnings 作用范围是和你放置的位置相关

比如 @SuppressWarnings 放置在 main 方法,那么抑制警告的范围就是 main 通常我们可以放置具体的语句, 方法, 类

看看 @SuppressWarnings 源码 修饰的程序元素为,查看@Target放置的位置就是

TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE

生成@SupperssWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置)

元注解

JDK 的元 Annotation 用于修饰其他 Annotat

元注解的种类

  1. Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
  2. Target // 指定注解可以在哪些地方使用
  3. Documented //指定该注解是否会在 javadoc 体现
  4. Inherited //子类会继承父类注解

@Retention 注解

  1. RetentionPolicy.SOURCE: 编译器使用后,直接丢弃这种策略的注释

  2. RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值

  3. RetentionPolicy.RUNTIME:编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以 通过反射获取该注解

@Target 注解

用于修饰 Annotation 定义,用于指定被修饰的 Annotation能用于修饰哪些程序元素.@Target也包含一个名为 value的成员变量。

@Documented注解

基本说明

@Documented:用于指定被该元 Annotation修饰的 Annotation类将被javadoc 工具提取成文档,即在生成文档时,可以看到该注解。

说明:定义为Documented的注解必须设置Retention值为RUNTIME

@Inherited 注解

被它修饰的Annotation 将具有继承性.如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解

说明:实际应用中,使用较少,了解即可

元注解:本身作用不大,看源码时,可以知道他是干什么

异常-Exception

基本概念

Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)

执行过程中所发生的异常事件可分为两大类

  1. Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out ofmemory),Error是严重错误,程序会崩溃。

  2. Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编程时,编译器检查出的异常]

异常体系图

异常体系图的小结

1.异常分为两大类,运行时异常和编译时异常

2.运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常

3.对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响

4.编译时异常,是编译器要求必须处置的异常。

常见的运行时异常包括

  1. NullPointerException 空指针异常

  2. ArithmeticException 数学运算异常

  3. ArrayIndexOutOfBoundsException 数组下标越界异常

  4. ClassCastException 类型转换异常

  5. NumberFormatException 数字格式不正确异常[]

编译异常

介绍

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译

常见的编译异常

√ SQLException//操作数据库时,查询表可能发生异常

√ IOException/操作文件时,发生的异常

√ FileNotFoundException/当操作一个不存在的文件时,发生异常

√ ClassNotFoundException/加载类,而该类不存在时,异常

√ EOFException/操作文件,到文件末尾,发生异常
√ IllegalArguementException/参数异常

异常处理

异常处理就是当异常发生时,对异常处理的方式。

异常处理的方式

​ try-catch-finally

程序员在代码中捕获发生的异常,自行处理

​ throws

将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM

示意图

try-catch 方式处理异常说明

1)Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个try.catch块。

try-catch 方式处理异常-注意事项

1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块

2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch

3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码-finally{}

4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后NullPointerException在前),如果发生异常,只会匹配一个catch

5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑

小结

1)如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句

2)如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句!