注解的理解
- 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
- 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。
- 在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角色,
例如用来配置应用程序的任何切面,代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等
基本的 Annotation 介绍
使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元 素 三个基本的 Annotation:
- @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法
- @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
- @SuppressWarnings: 抑制编译器警告
@Override 注解
@Override 使用说明
@Override表示指定重写父类的方法(从编译层面验证)如果父类没有fly方法,则会报错
如果不写@Override注解,而父类仍有 public void fly(){},仍然构成重写
@Override只能修饰方法,不能修饰其它类,包,属性等等
查看@Override注解源码为@Target(ElementType.METHOD),说明只能修饰方法
@Targe是修饰注解的注解,称为元注解,
@Deprecated 注解
用于表示某个程序元素(类,方法等)已过时
可以修饰方法,类,字段,包,参数等等
@Target(value={CONSTRUCTOR, FIELD, LOCAL VARIABLE, METHOD,PACKAGE, PARAMETER, TYPE})
@Deprecated的作用可以做到新旧版本的兼容和过渡
@SuppressWarnings 注解
- 当我们不希望看到这些警告的时候,可以使用 SuppressWarnings 注解来抑制警告信息
- 在{“”} 中,可以写入你希望抑制(不显示)警告信息
可以指定的警告类型有
- all,抑制所有警告
- boxing,抑制与封装/拆装作业相关的警告
- cast,抑制与强制转型作业相关的警告
- dep-ann,抑制与淘汰注释相关的警告
- deprecation,抑制与淘汰的相关警告
- fallthrough,抑制与 switch 陈述式中遗漏 break 相关的警告
- finally,抑制与未传回 finally 区块相关的警告
- hiding,抑制与隐藏变数的区域变数相关的警告
- incomplete-switch,抑制与 switch 陈述式(enum case)中遗漏项目相关的警告
- javadoc,抑制与 javadoc 相关的警
- nls,抑制与非 nls 字串文字相关的警告
- null,抑制与空值分析相关的警告
- rawtypes,抑制与使用 raw 类型相关的警告(传参时没有指定泛型错误警告)
- resource,抑制与使用 Closeable 类型的资源相关的警告
- restriction,抑制与使用不建议或禁止参照相关的警告
- serial,抑制与可序列化的类别遗漏 serialVersionUID 栏位相关的警告
- static-access,抑制与静态存取不正确相关的警告
- static-method,抑制与可能宣告为 static 的方法相关的警告
- super,抑制与置换方法相关但不含 super 呼叫的警告
- synthetic-access,抑制与内部类别的存取未最佳化相关的警告
- sync-override,抑制因为置换同步方法而遗漏同步化的警告
- unchecked,抑制与未检查的作业相关的警告
- unqualified-field-access,抑制与栏位存取不合格相关的警告
- unused,抑制与未用的程式码及停用的程式码相关的警告
关于 SuppressWarnings 作用范围是和你放置的位置相关
比如 @SuppressWarnings 放置在 main 方法,那么抑制警告的范围就是 main 通常我们可以放置具体的语句, 方法, 类
看看 @SuppressWarnings 源码 修饰的程序元素为,查看@Target放置的位置就是
TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
生成@SupperssWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置)
元注解
JDK 的元 Annotation 用于修饰其他 Annotat
元注解的种类
- Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
- Target // 指定注解可以在哪些地方使用
- Documented //指定该注解是否会在 javadoc 体现
- Inherited //子类会继承父类注解
@Retention 注解
RetentionPolicy.SOURCE: 编译器使用后,直接丢弃这种策略的注释
RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
RetentionPolicy.RUNTIME:编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以 通过反射获取该注解
@Target 注解
用于修饰 Annotation 定义,用于指定被修饰的 Annotation能用于修饰哪些程序元素.@Target也包含一个名为 value的成员变量。
@Documented注解
基本说明
@Documented:用于指定被该元 Annotation修饰的 Annotation类将被javadoc 工具提取成文档,即在生成文档时,可以看到该注解。
说明:定义为Documented的注解必须设置Retention值为RUNTIME
@Inherited 注解
被它修饰的Annotation 将具有继承性.如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解
说明:实际应用中,使用较少,了解即可
元注解:本身作用不大,看源码时,可以知道他是干什么
异常-Exception
基本概念
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
执行过程中所发生的异常事件可分为两大类
Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out ofmemory),Error是严重错误,程序会崩溃。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编程时,编译器检查出的异常]
异常体系图
异常体系图的小结
1.异常分为两大类,运行时异常和编译时异常
2.运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常
3.对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
4.编译时异常,是编译器要求必须处置的异常。
常见的运行时异常包括
NullPointerException 空指针异常
ArithmeticException 数学运算异常
ArrayIndexOutOfBoundsException 数组下标越界异常
ClassCastException 类型转换异常
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里面的语句!