异常
异常代表程序出现的问题。
Error错误和Exception异常。
RuntimeException运行时异常。
编译时异常,提醒程序员这里的程序很容易出错。
异常的基础处理
- 抛出给上层调用者。
- 使用try-catch处理。
异常的处理方案
- 底层异常抛出,最外层捕获异常记录异常并响应合适信息。
- (少见)最外层捕获异常,并尝试重新修复。
异常的作用
- 异常是用来定位程序bug的关键信息。
- 可以作为方法内部的一种特殊返回值,以便通知上层调用者,方法的执行问题。
自定义异常
分为自定义运行时异常和自定义编译时异常。
自定义编译时异常提醒比较激进,编译时就报错,需要抛出。
自定义运行时异常提醒不激进。
开发中使用哪个异常:如果担心问题很容易出现,就定义成编译时异常;不想干扰别人,就定义成运行时异常。
现在的规范就是禁止大家使用编译时异常,尽量使用运行时异常。
泛型
定义类、接口、方法时,同时声明了一个或多个类型变量。如<E>
。
泛型类、泛型接口、泛型方法,统称为泛型。
泛型的常用类型变量
一般用大写的ETKV
,E
一般是元素类型,T
是返回值类型,KV
是键值类型。
泛型的作用
泛型提供了在编译阶段约束所能操作的数据类型,并自动进行类型检查。可以避免强制类型转换及其可能出现的异常。
泛型类和泛型接口
修饰符 class 类名<类型变量,类型变量...> {
}
修饰符 interface 接口名<类型变量,类型变量...> {
}
泛型方法
修饰符 <类型变量,类型变量...> 返回值类型 方法名(形参列表){
}
泛型的一些注意事项
- 自己通过
<E>
定义的才是泛型方法。使用E
的不叫做泛型方法。 - 虽然Xiaomi和BYD是Car的子类,但是
ArrayList<xiaomi>
、ArrayList<BYD>
和ArrayList<Car>
没有半毛钱关系!
泛型的上下限
- 通配符是
?
,可以在使用泛型的时候代表一切类型。 - 泛型上限:
? extends Car
,?
能接收的必须是Car或者其子类。 - 泛型下限:
? super Car
,?
能接收的必须是Car或者其父类。
泛型支持的类型以及包装类
泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。因为牵扯到泛型擦除。
泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除。所有类型都会被恢复成Object类型。如果是Object o = 12;
很明显是不对的。
包装类
使用包装类,把基本数据类型包装成对象的类型。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
包装类如何包装基本数据类型
- 过时方法:
public Integer(int value)
。 - 现有方法:
public static Integer valueOf(int i)
- 推荐方法:自动装箱。
自动装箱,自动拆箱
基本数据类型可以直接转换为包装类型;包装类型可以自动转换为基本数据类型。
Integer it = 100;
int i = it;
包装类的其他功能
- 可以把基本类型的数据转换成字符串类型。
public static String toString(double d)
public String toString)
同样的功能可以通过用+
拼接空字符串实现。
- 可以把字符串类型的数值转换成数值本身对应的真实数据类型(有用)
public static int parseInt(String s)
public static Integer valueOf(String s)
int i = Integer.valueOf("456");// 转换和自动拆箱