枚举类
- 枚举是一组常量的集合,枚举属于一种特殊的类,里面只包含一组有限的特定的对象
- 自定义类实现枚举:
- 不需要提供setXxx方法,因为枚举对象值通常为只读
- 对枚举对象/属性使用 final + static 共同修饰, 实现底层优化
- 枚举对象名通常使用全部大写,常量的命名规范
- 枚举对象根据需要,也可以有多个属性
- 进行自定义类实现枚举,有如下特点:
- 构造器私有化
- 本类内部创建一组对象
- 对外暴露对象(通常为对象添加public final static 修饰符)
- 可以提供get方法,但是不要提供set方法
- 使用关键字enum 来实现枚举类:
- 使用关键字enum 替代class
- 常量名(实参列表)
- 如果有多个常量(对象),使用" , "号间隔即可
- 如果使用enum来实现枚举,要求将定义常量对象,写在前面
- enum关键字实现枚举注意事项:
- 当我们使用enum关键字开发一个枚举类时, 默认会继承Enum类, 而且是一个final类
- 如果使用无参构造器 创建 枚举对象, 则实参列表和小括号都可以省略
- 当有多个枚举对象时, 使用,间隔,最后有一个分号结尾
- 枚举对象必须放在枚举类的行首
- 使用关键字enum时,会隐式继承Enum类,这样我们就可以使用Enum类相关的方法:
- 使用细节:
- 使用enum关键字后,就不能再继承其它类了,因为enum会隐式继承Enum,而java是单继承机制
- 枚举类和普通类一样,可以实现接口, 如 enum 类名 implements 接口{ }
注解
-
注解也被称为元数据,用于修饰解释包 ,类 ,方法 ,属性, 构造器,局部变量等数据信息
-
和注释一样,注解不影响程序逻辑,但注解可以被编译或者运行,相当于嵌入在代码块中的补充信息
-
在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在javaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替java EE旧版中所遗留的繁冗代码和XML配置等
-
Override:
- @Override 限定某个方法,是重写父类方法,该注解只能用于方法
- @interface 不是 interface , 是注解类,是jdk5.0之后加入的
-
Deprecated:
- 用于表示某个程序元素(类,方法等)已过时
- 可以修饰方法,类,字段,包,参数 等等
- @Deprecated 的作用可以做到新旧版本的兼容和过渡
-
SuppressWarnings:
- 抑制编译器警告
- @SuppressWarnings({“ ”})中,可以写入你希望抑制(不显示)警告信息
- 和放置的位置有关
- 说明各种值:
- unchecked 是忽略没有检查的警告
- rawtypes 是忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
- unused 时忽略没有使用某个变量的警告错误
-
元注解的基本介绍: JDK的 元注解用于修饰其他注解
- 种类:
- Retention // 指定注解的作用范围,三种 SOURCE, CLASS, RUNTIME
- Target // 指定注解可以在哪些地方使用
- Documented //指定该注解是否会在javadoc体现
- Inherited // 子类会继承父类注解
-
@Retention的三种值:
- RetentionPolicy.SOURCE: 编译器使用后,直接丢弃这种策略的注释
- RetentionPolicy.CLASS: 编译器将把注解记录在class文件中。当运行java程序时,JVM不会保留注解。这是默认值
- RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中。当运行java程序时,JVM程序时,JVM会保留注解,程序可以通过反射获取该注解
-
@Target:
- 用于修饰注解定义,用于指定被修饰的Annotation 能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量
-
@Documented:
- 用于指定被该元注解修饰的注解类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解
- 定义为Documented的注解必须设置Retention值为RUNTIME
-
@Inherited:
- 被它修饰的注解将具有继承性,如果某个类使用了被@Inherited 修饰的Annotation,则其子类将自动具有该注解
异常处理
-
Java语言中,将程序执行中发生的不正常情况称为"异常"。
-
执行过程中所发生的异常事件可分为两类
- Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误,资源耗尽等严重情况
- Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception 分为两大类:运行时异常[程序运行时,发生的异常]和编译时异常[编译时,编译器检查出的异常]
-
运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常
-
对于运行时异常,可以不作处理,因为这类异常很普通,若全处理可能会对程序的可读性和运行效率产生影响
-
编译时异常,是编译器要求必须处置的异常,否则代码不能通过编译:
- 常见的编译异常:
- SQLException //操作数据库时, 查询表可能发生异常
- IOException //操作文件时,发生的异常
- FileNotFoundException //当操作一个不存在的文件时,发生异常
- ClassNotFoundException //加载类, 而该类不存在时,异常
- EOFException //操作文件,到文件末尾,发生异常
- 常见的编译异常:
-
常见的运行时异常包括:
- NullPointerException空指针异常
- ArithmeticException数学运算异常
- ArrayIndexOutOfBoundsException数组下标越界异常
- ClassCastException类型转换异常
- NumberFormatException数字格式不正确异常
-
异常处理就是当异常发生时,对异常处理的方式
- try-catch-finally 程序员在代码块中捕获发生的异常,自行处理
- throws 将发生的异常抛出,交给调用者来处理,最顶级的处理者是JVM
-
try{
代码/可能有异常
}catch(Exception e){
//捕获到异常
//1.当异常发生时,系统将异常封装成Exception 对象e,传递给catch
//2.得到异常对象后,程序员自己处理
//3.注意,如果没有发生异常catch代码块不执行
}finally{
//1.不管try代码块是否有异常发生,始终要执行finally
//2.所以,通常将释放资源的代码,放在finally
}
-
如果程序员没有显示处理异常,默认throws
-
try-catch方式处理异常注意事项:
- 如果异常发生了,则异常后面的代码不会执行,直接进入到catch块
- 如果异常没有发生,则顺序执行try的代码块,不会进入到catch
- 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)
- 可以有多个catch语句,捕获不同的异常,要求父类异常在后,子类异常在前,比如(Exception 在后, NullPointerException 在前),如果发生异常,只会匹配一个catch
- 可以进行 try-finally 配合使用,这种用法相当于没有捕获异常,因此程序会直接崩溃。应用场景, 就是执行一段代码, 不管是否发生异常,都必须执行某个业务逻辑
-
小结:
- 如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
- 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句
-
throws基本介绍:
- 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
- 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
-
throws注意事项和使用细节:
- 对于编译异常,程序中必须处理,比如 try-catch 或者 throws
- 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
- 子类重写父类的方法时,对抛出异常的规定: 子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型
- 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
-
自定义异常: 当程序中出现了某些"错误",但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息
- 一般情况下,我们自定义异常是继承RuntimeException
- 即把自定义异常做成运行时异常,好处是,我们可以使用默认的处理机制
-
throw 和 throws的区别
意义 位置 后面跟的东西 throws 异常处理的一种方式 方法声明处 异常类型 throw 手动生成异常对象的关键字 方法体中 异常对象