1. 泛型
说明:
-
通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型
-
如Collection<E>,Map<K,V>,Dao<T>
-
泛型中无继承关系,泛型不同的引用不能相互赋值
-
泛型中不能指定基本数据类型,可以指定包装类型
-
泛型可以定义在类,接口中,也可以定义在变量,方法返回值类型,方法参数类型中
下面就以模拟MVC开发模式举例,泛型定义在类上的作用:
首先有两个空内容的类,分别是Student,Teacher类
public class Teacher {
}
public class Student {
}
然后定义一个Dao类,Dao在MVC中被称为数据操作层,有数据最基本的增删查改的方法,泛型就用在这里
public class Dao<T> {
//这里只写一个增加的方法,其他方法同理
public void add(T t) {
}
}
最后再写两个类,StudentDao和TeacherDao,都继承Dao类
//泛型中定义Teacher类,说明TeacherDao可以操作Teacher类
public class TeacherDao extends Dao<Teacher>{
@Override
public void add(Teacher t) {
// TODO Auto-generated method stub
super.add(t);
}
}
//泛型中定义Student类,说明StudentDao可以操作Student类
public class StudentDao extends Dao<Student>{
@Override
public void add(Student t) {
// TODO Auto-generated method stub
super.add(t);
}
}
可以看到,这样一来不同的Dao对于数据的操作就可以被区分,相关的Dao操作相关的类,非常好用
泛型定义在接口上也是同样的道理
都知道集合可以储存不同类型的元素,但是当我们要使用集合中的元素时,集合中元素类型的多样性反而会使代码变得复杂
这个时候就可以使用泛型,以ArrayList为例:
//泛型中定义的是Integer类型,也就是说该集合只能存放Integer类型和int类型的元素
ArrayList<Integer> list = new ArrayList<>();
等号右边的泛型的定义类型会通过等号左边自动推断(jdk1.8以后)
该定义方式被称为钻石表达式
2. 异常
Throwable
说明:
在程序执行过程中遇到预期之外的情况导致JVM运行停止
大概的继承结构图:
异常的捕捉方式:
- try…catch
try {
//该代码块内运行可能会发生异常的代码
} catch (Exception e) {
// 异常的处理方式
//捕获异常,形参为要捕获异常的类型,异常的类型可以向上兼容
e.printStackTrace();
}finally{
//这里的代码在try..catch后执行且一定会执行
}
- throw/throws抛出异常,再用try…catch 捕捉
throws:表示可能会抛出的异常,用在方法声明后面,有就抛没有就不抛
throw:手动抛出一个异常,用在方法体内,该异常可以是自定义的异常类
例子:
//自定义一个MathException类继承Exception类,并且继承其中一个打印异常信息的构造方法
public class MathException extends Exception{
public MathException(String message) {
super(message);
}
}
public class Test2 {
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
// 捕获异常,打印异常信息
System.out.println(e.getMessage());
}
}
//该方法抛出自定义的异常类
private static void test() throws MathException{
try {
int num = 5/0; //一定会有异常
} catch (Exception e) {
//抛出异常
throw new MathException("除以0异常");
}
}
}
运行结果:
注意:抛异常都是抛给上一级调用的方法,谁调用我,我就抛给谁