目录
1.异常的基本概念
1.什么是异常
2.java中有哪些异常
3.常见的异常有哪些
2.异常的处理
1.异常的处理:抓抛模型
2.异常处理方式一:try-catch-finally
3.finally的使用
4.异常处理方式二:throws+异常类型
5.两种方式的选择
6.异常对象的产生
7.自定义异常类
8.throw和throws区别
异常:程序执行中发生的不正常情况。
error:jvm无法解决的严重问题,一般不编写针对性代码进行处理。
exception:编程错误或外在因素导致的一般性问题,可以使用针对性代码处理。
exception异常分为:编译时异常(checked)和运行时异常(unchecked)
1.空指针异常:NullPointerException
2.索引越界异常:ArrayIndexOutOfBoundsException
3.类型转换异常:ClassCastException
4.数值转换异常:NumberFormatException
过程一:抛出异常
程序正常执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。
过程二:处理异常
1.try-catch- finally
2.throws
1.finally是可选的,不一定要写。
2.使用try将可能异常代码包装起来,一旦出现异常,就会生成一个对应异常类的对象,根据此对象类型,去catch中匹配。
3.匹配到一个catch时就进入catch中进行异常处理。处理完成后跳出当前的try- catch结构(无finally)。继续执行后面的代码。
4.try-catch中和if- else一样,范围小的写在上面。子类声明在父类上面,否则报错。
5.try结构中定义的变量在try外界无法调用
6.使用try- catch- finally处理异常,在编译时不报错,在运行时仍可能报错。
代码示例:
public class Demo2 {
public static void main(String[] args) {
int[][] arr = new int[3][];
AA a = new AA();
try {
System.out.println(arr[2][2]);
a.getArr();
}catch(NullPointerException e){
e.printStackTrace();
System.out.println("异常已处理");
}finally{
System.out.println("我一定会出现");
}
}
}
class AA{
public int getArr(){
return 1;
}
}
1.finally中声明的一定会被执行,即使catch中再次出现异常,或者try中有return或catch中有return。
2.finally执行先于try和catch中的返回语句,但若try中可以输出就先输出try。
3.数据库连接、输入输出流、网络编程Socket等资源,jvm不能自动回收,需要手动进行资源的释放。此时的资源释放需要声明在finally中。
4.try- catch结构可以嵌套。
5.开发中,由于运行时异常比较常见,通常不针对运行时异常编写try- catch- finally。针对编译时异常,一定要考虑异常的处理。
1.throws +异常写在方法的声明处,指明方法执行时可能出现的异常;一但方法体执行时出现异常,仍在异常代码处生成一个异常类的对象。此对象满足throws后异常类型时,就被抛出,异常代码后续代码不再执行
2.try- catch真正处理了异常;
throws只是将异常抛给了方法的调用者,并没有解决异常,解决异常还是需要使用try- catch- finally
public class Demo3 {
public static void main(String[] args) throws FileAlreadyExistsException {
D d = new D();
d.eat();
d.sleep();
}
}
class D{
public void eat() throws NullPointerException{
System.out.println("1");
}
public void sleep() throws FileAlreadyExistsException{
System.out.println("2");
}
}
1.若父类被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws;若子类重写的方法中有异常,必须使用try- catch- finally方式处理。
2.执行的方法a中先后调用了另外的几个方法,这几个方法递进关系依次执行,则建议几个方法使用throws方式处理。执行的方法a可以使用try- catch- finally进行处理。
1.系统自动生成的异常对象
2.手动的生成一个异常对象,并抛出(throw);
public Employee getEmployee (int id) throws TeamException{
for (int i = 0; i < employees.length; i++) {
if (employees[i].getId() == id){
return employees[i];
}
}
throw new TeamException("您所查找的客户不存在!");
}
1.继承现有的异常类:RuntimeException、Exception(编译时就要处理)
2.提供long型全局常量serialVersionUID序列号
3.提供重载的构造器
public class TeamException extends Exception {
static final long serialVersionUID = -3387516993122578948L;
public TeamException(){
}
public TeamException(String message){
super(message);
}
}
throw表示抛出一个异常类的对象,属于生成异常对象的过程,声明在方法体内。
throws属于异常处理的一种方式,声明在方法的声明处。