心得体会
一开始我也不太理解泛型,后面按老师说的自己尝试去写一个简单的ArrayList方法后,才真正理解了。当然说是自己写,其实大部分都是参考源码来敲,但是这样做真的有利于加深对列表和泛型的理解。异常处理感觉还是很实用的,而且处理方法也很简单。
内容简概
- 一、泛型的简单使用
- 二、异常类的层次结构
- 三、处理异常的五个关键字
- 四、异常的处理方法
- 五、自定义异常类
- 六、自定义异常类的使用(throw和try...catch的联合使用)
具体内容
-
一、泛型的简单使用
1. 概念
Java中有多种数据类型,而泛型,顾名思义,不是一种广泛的数据类型,它包括其他大部分数据类型。
2. 为什么要用泛型?
泛型的使用非常广泛,如泛型类、泛型方法、泛型接口。就拿泛型和数组来说,一个数组中可以存放不同的数据类型,那编写这个数组类时,就需要用一个东西来替代传入的参数类型,而这个参数类型不确定,这时就需要用到泛型了。
3. 泛型常见字母含义
格式: 类名<字母列表>class Person<T>{}
字母 | 含义 |
---|---|
E | Element 元素 |
K | Key 键 |
N | Number 数值 |
T | Type 类型 |
V | Value 值 |
? | 不确定的类型 |
4. 泛型的简单使用
运行结果为:False
class GenericTest<T>{
int age;
T a1;
T a2;
public void test(T a1, T a2){
this.a1 = a1;
this.a2 = a2;
System.out.println(a1.equals(a2));
}
}
public class MyClass {
public static void main(String[] args){
//<T>被替换成<String>
GenericTest<String> g1 = new GenericTest<>();
g1.test("jack","jacker");
}
}
二、异常类的层次结构
Java的异常是一个对象,所有的异常都直接或间接地继承Throwable类。Throwable类的继承层次结构如下:
异常类的层次结构
三、处理异常的五个关键字
关键字 | 用法 |
---|---|
try | 它里面放置可能引发异常的代码 |
catch | 后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。 |
finally | 主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者 throw等终止方法的语句,则就不会跳回执行,直接停止。 |
throw | 用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。 |
throws | 用在方法签名中,用于声明该方法可能抛出的异常。 |
-
四、异常的处理方法
方法一:try...catch
要注意的是,如果异常出现,try{}异常语句后面的代码将不会被执行,所以尽量不要放太多代码在try{中}
try{
执行的代码
可能出现异常
一旦出现异常 系统自动为我们创建一个异常对象 并抛出
}catch(NullPointerException){
如果需要自己处理异常就catch
}catch(IOException e){
如果有多个异常 可以使用多个catch来捕获
如果有多个异常 catch的顺序是从小到大
}catch(Exception1 e){
}finally{
不管有没有异常finally都会被执行
处理资源回收 网络连接 数据库连接 I/O流
}
方法二:throw (异常类型)
一般自己编写代码时,还是抛出具体的异常类型比较好,不过如果异常太多了,也可以直接抛出IOException等大的异常类型,这样代码看起来也比较简洁。
//文件不存在异常、空指针异常
public static void test() throws FileNotFoundException,NullPointerException{
FileReader fr = new FileReader("");
}
//也可直接用大的异常类型来解决
public static void test() throws IOException{
FileReader fr = new FileReader("");
}
五、自定义异常类
书写格式如下:
class MyException extends Exception{
// 1.提供一个无参构造方法
public PXDException(){
}
// 2.提供一个有参构造方法 参数是一个字符串
public PXDException(String desc){
super(desc);
}
}
六、自定义异常类的使用(throw和try...catch的联合使用)
自定义异常类的好处就在于可以时异常提示更为通俗易懂,因为Java本身的异常提示一般是不太容易看得懂的。下面代码的
运行结果为:自己的异常类:无所作为Exception1.java->main->75
public class Exception1 {
public static void main(String[] args){
try {
TException.test2();
}catch (MyException e){
System.out.println(e.getMessage());
}
}
}
class TException {
public static void test() throws FileNotFoundException,NullPointerException{
//尝试打开一个不存在的文件
FileReader fr = new FileReader("");
}
public static void test2() throws MyException {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stackTrace[2];
//提示错误的代码位置:文件→方法→代码行数
String detail = e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();
throw new MyException("自己的异常类:无所作为"+detail);
}
}
class MyException extends Exception{
// 1.提供一个无参构造方法
public MyException(){
}
// 2.提供一个有参构造方法 参数是一个字符串
public MyException(String desc){
super(desc);
}
}
网友评论