JavaSE(十一)
--泛型、反射和异常
一、泛型
泛型是javaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
在javaSE1.5之前,没有泛型的情况下,通过对类型Object的引用来实现参数的”任意化”,”任意化”带来的缺点是要做显示的强制类型转换,而用这种转换的要求是要求开发者对实际参数可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动的和隐式的,提高代码的重用率。
这段话的意思是,javaSE1.5之前,假设我们在集合中存入了一个Object对象,这个Object对象我们知道是什么类型的,但是编译器不知道,所以取出来的时候还得强转,而且我们只有在知道这个对象类型的时候才能强转,否则看起来没错,运行时候还会抛异常呢。
二、反射
一个对象可以通过object.getClass()获得它运行时的类.
可以getName获得类名..
可以再getDeclaredMethods()获取这个类的所有能访问到的方法,获取到方法之后可以遍历,通过getName获取方法名,getModifiers()获取方法修饰符...
也可以getGenericInterfaces获取该类所有的接口。
可以getFields获取所有的能访问到的成员变量,再遍历中getName获取变量名,getModifiers()获取变量修饰符...
更多方法参考java.lang.reflect的帮助文档
三、异常
1.简介: 当程序出现无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏)时,java就会用异常对象来描述.
2.分类:
①检查性异常(java.lang.Exception)
程序正确,但因为外在的环境条件不满足,所以引发检查性异常。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
例如FileReader fileReader=new FileReader(new File("D:\666.txt"));,马上系统会提示你有一个异常未处理,因为你找文件,它可能找不到啊,如果找不到怎么办?这是一个异常,所以需要你马上处理。
②运行时异常(java.lang.RuntimeException)
这意味着程序存在bug,例如数组越界、0被除、入参不满足规范...这类异常需要更改程序来避免,java编译器强制要求处理这类异常。
③错误(java.lang.Error)。
一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽,错误在程序中无需处理,而由运行环境处理。
顶层是java.lang.Throwable类,检查性异常、运行时异常、错误都是这个类的子孙类(Exception和Error继承自Throwable,而RuntimeException继承自Exception)。
3.处理方式: java用两种方法来处理异常,①在发生异常的地方直接处理②将异常抛给调用者,让调用者处理.
try {
可能发生异常的操作A;
} catch (异常种类1 e) {
该异常处理。//一般e.printStackTrace();
}catch (异常种类2 e) {
该异常处理。//一般e.printStackTrace();
}
一般还会在最后加一个finally,如果把finally块至于try...catch...语句后,finally块一般都会得到执行(不管发没发生异常),它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行,一般我们在finally中实现对资源、流的关闭。
以下情况,finally块将不会被执行:
①finally块中发生了异常;
②程序所在线程死亡;
③前面的代码中使用了System.exit();
④关闭cpu;
Throw Exception,函数A 抛出一个异常,表面我这个函数不想管这个异常,到时候谁调用函数A谁再管这个异常。
4.异常的作用
当程序执行到某一块有错的时候,发生了异常,我们并不想让程序就此停住,因为有可能这个异常根本不影响后面代码的执行,所以我们处理异常并让程序继续执行。