目录
16、注解
-
注解(Annotation)也被称为源数据(Metadata),用于修饰解释(包、类、方法、属性、构造器、局部变量等数据信息)
-
和注释一样,注解不影响程序的逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息
-
在javaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在javaEE中,注解占据了更重要的角色,例如配置应用程序的任何切面,代码javaEE旧版中所遗留的代码和XML配置
1、注解
1、@Override :限定某个方法,是重写父类方法,该注解只能用于方法
2、@Derpecated:用于表示某个程序元素(类、方法等)过时
3、@SuppressWarnings:抑制编译器警告
2、注解的声明
注解的声明 @interface 代表是一个注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
3、细节
-
@Override的使用说明
@Override 表示指定重写父类的方法 (从编译层面验证)如果父类没有定义该方法,则编译期间就会报错 如果不写@Override注解,而父类中仍然有这个方法,仍然构成重写 @Override只能修饰方法,不能修饰其他类,包,属性等等 @Target 是修饰注解的注解,称为元注解
-
@Deprecated的使用说明
用于表示某个成员元素 (类,方法 属性等)已经过时 可以修饰方法 类 字段 包 参数等等 即使修饰了,只是代表已经过时,不建议使用,但是还是可以使用 (修饰后的方法 类 等会出现 中划线) @Deprecated 这是旧版本到新版本过渡的使用
-
@SuppressWarnings:抑制编译器警告
有警告也不会出错 这个注解有很多值,不用记录,直接点击左侧的黄色提示,就可以选择(注意生产的位置)
4、元注解
1.种类
-
Retention 指定注解的作用范围 SOURCE CLASS RUNTIME
-
RetentionPolicy.SOURCE :编译器使用后,直接丢弃之恩重策略的注解
-
RetentionPolicy.CLASS:编译器将注解记录在class文件中,当运行java程序的时候,jvm不会保留注解。这是默认值
-
RetentionPolicy.RUNTIME:编译器会将注解记录在class文件中,当运行java程序的时候,jvm会保留这个注解,程序可以通过反射获取该注解
-
-
Target 指定注解可以在哪些地方使用
ElementType类中的枚举 可以写多个
public enum ElementType { /** 类、接口(包括注释类型)或枚举声明*/ TYPE, /** 字段声明(包括枚举常量) */ FIELD, /** 方法声明*/ METHOD, /** 方法参数声明*/ PARAMETER, /** 构造器声明*/ CONSTRUCTOR, /**局部变量声明 */ LOCAL_VARIABLE, /**注解类型声明*/ ANNOTATION_TYPE, /** 包声明 */ PACKAGE, /** * 用来标注类型参数 即能标注在泛型中 * * @since 1.8 */ TYPE_PARAMETER, /** * 能标注任何类型名称 即哪里有可以 * * @since 1.8 */ TYPE_USE }
-
Documented 指定该注解是否在javadoc中显示
-
Inherited 子类会继承父类注解
被@Inherited修饰的注解将具有继承性,如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解
17、异常
当出现异常,没有捕获的时候,到达出现异常的地方就停止了,这样对于整个程序的健壮性是非常不好的
因此 java设计者,认为一段代码可能出现异常/问题,可以使用try-catch异常处理机制来解决 ,从而保证程序的健壮性
IDEA的快捷方式 ctrl + alt + t 进行try catch捕获
重点: 如果使用了异常处理,那么即使出现异常,程序也可以继续执行,而不是直接崩溃
1、概念
java语言中,将程序执行中发生的不正常请称为“异常” (开发过程中语法错误和逻辑错误不是异常)
执行过程中所发生的异常可以分为两类
-
Error(错误) Java虚拟机无法解决的严重问题。如 JVM系统内部错误、资源耗尽等严重情况,Error是严重错误,程序会崩溃
-
Exception 异常:因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针异常,读取不存在的文件等等
Exception分为两类 运行时异常 【程序运行时发生的异常】和 编译时异常【编程时,由编译器检查出的异常】
2、异常图
异常分为两大类,运行时异常 和 编译时异常
-
运行时异常,编译器不强制要求处理的异常。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常 java.lang.RuntimeException类及它的子类都是运行时异常
-
对应运行时异常,可以不全部做处理,因为这类异常很普遍,如果全部处理可能会对程序的可读性和效率有影响
-
编译时异常,是编译器要求必须处置的异常
3、常见运行时异常
-
NullPointerException 空指针异常
当应用程序试图在需对象调用方法的时候,但是该对象为null ,抛出该异常
public class NullPointerException$ { public static void main(String[]args){ String str = null; str.length(); } }
-
ArithmeticException 数学运算异常
当出现异常额运算条件时,抛出异常 例如 一个整数除以零 抛出异常
public class ArithmeticException$ { public static void main(String[]args){ int i = 10 / 0; } }
-
ArrayIndexOutOfBoundsException 数组下标越界异常
用非法的索引访问数组时抛出的异常。如果索引为负数或者大于数组的大小,则该所索引为非法异常
public class ArrayIndexOutOfBoundsEXception$ { public static void main(String[]args){ int[] array = {1,2,3}; System.out.println(array[3]); } }
-
ClassCastException 类型转换异常
当试图将对象强转为不是该实例的子类时,抛出该异常
public class ClassCastException$ { public static void main(String[]args){ A b = new B(); //向上转型 B b2 = (B)b; //向下转型 ok C c = (C)b; //这里会抛出ClassCastException异常 } } class A { } class B extends A { } class c extends A { }
-
NumberFormatException 数字格式不正确异常
当应用程序试图将字符串准换成一种数值类型,但是该字符串不能转换为适当格式时,抛出异常 ==》使用异常我们可以确保输入的数据 是满足条件的数字
public class NumberFormatException$ { public static void main(String[]args){ String str = "w13"; int num = Integer.parseInt(str); //就会抛出异常 } }4、编译异常
编译异常就是在编译期间,就必须处理的异常,否则代码不能通过编译
常见的编译异常
-
SQLException 操作数据库的时候,查询表可能发生异常
-
IOException 操作文件是,发生的异常
-
FileNotFoundException(父类是IOException) 当操作一个不存在的文件时,发生的异常
-
ClassNotFoundException 加载类,而该类不存在时,异常
-
EOFException 操作文件,到文件末尾发生异常
-
IllegalArgumentException 参数异常
5、异常处理的方式
1、方式
-
try-catch-finally
程序员在代码中捕获发生的异常,自行处理
-
throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
总结
-
try-catch-finally 和 throws 二选一
-
如果程序员,没有显示的处理异常,默认是throws Exception 最终交给jvm处理
-
jvm处理异常的方法是 ①输出异常信息 ②中断程序
2、细节
-
如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
-
如果异常没有发生,则顺序执行try中代码,不会进入到catch中,如果有finally,最后还需要执行finally里面的语句
-
如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally
-
可以捕获多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前(范围小的在前,范围大的在后) 如果发生异常,只会匹配一个catch
-
可以进行try-finally 配合使用,这种用法没有捕获异常,一旦发生异常程序会崩掉(应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑)
-
如果出现异常,则try块中异常发生后,try块中剩下的语句不在执行。将执行catch中的语句,如果有finally,最后还需要执行finally里面的语句!
6、自定义异常
定义类:自定义异常类名(程序员自己写)继承Exception或者RuntimeException
如果继承Exception属于编译异常
如果继承RuntimeException 属于运行异常(一般来说我们继承RuntimeException)
一般与throw new 自定义异常 进行配合使用,当符合条件后主动抛出异常
7、throw和throws的区别
关键字 | 意义 | 位置 | 后面跟的东西 |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |