一.异常的概念和分类
1.1 什么是异常?
- 所谓的异常是指,程序运行过程中,发生了一些不正常的事件。(如:除0溢出, 数组下标越界,所要读取的文件不存在)
1.2异常导致的后果
- Java程序执行的过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其提交给运行时的Java系统,这个过程称为抛出异常,不处理的话会直接导致程序中断。
1.3如何防止程序中断
- 设计良好的程序应该在程序异常发生时,提供处理这些异常的方法。使得程序不会因为异常的发生的阻断,或产生不可预见的结果。
1.4异常分类(throw able)
- 按能否处理分类
1. error:系统产生,无法处理,和代码没有关系
2. Exception:能处理,其又分为IO Exception和Runtime Exception - 按是否受查分类
- checkedException: Exception及其子类(Runtime Exception及其子类除外),由代码控制能力之外产生的运行错误,必须处理,否则通不过编译
- uncheckedException: error和Runtime Exception及其子类,Runtime Exception一般代表编程错误,可以不用处理
1.5 异常处理机制
- try-catch-finally
- try:监控区域,执行可能产生异常的代码
- catch:捕获,处理异常
- finally:善后处理,无论是否发生异常,代码总能执行
二.异常处理
2.1 try-catch-finally
- try 语句中放的时要检测的Java代码, 肯能会抛出异常,也可能会正常执行
- catch(异常类型}()是当Java运行时,系统接收到try快中所抛出的异常对象,会寻找能处理这一异常的catch来处理异常(可以有多个catch块)
- finally{},不管系统有没有抛出异常,都会去执行,一般用来释放资源。除非在这之前执行了System.exit(0)
- try,catch,finally,不一定要全部写上,可以是try+catch和try+finally;但使用了try就一定要处理异常。
- 所有异常经过正确处理后,程序是可以继续正常运行的。
import java.util.Scanner;
public class error {
public static void main(String[] args) {
int a = 10;
int b ;
double c;
Scanner sc = new Scanner(System.in);
System.out.println("请输入除数:");
b = sc.nextInt();
try{
c = a/b;
}catch(java.lang.ArithmeticException e){
System.out.println("除数为0,请重新输入:");
b= sc.nextInt();
c= (double)a/b;
System.out.println("c="+c);
}finally{
System.out.println("finally end");
}
System.out.println("class end");
System.out.println("class end");
System.out.println("class end");
System.out.println("class end");
System.out.println("class end");
}
}
请输入除数:
0
除数为0,请重新输入:
10
c=1.0
finally end
class end
class end
class end
class end
class end
2.2 throw 和throws
-
throw可以手动抛出异常,作为程序员可以在任意位置,手动抛出异常
-
throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理
-
两者的区别
- throw 用在方法内,后面要跟上要抛出异常类的对象
- throws 在修饰方法上,告诉调用者,此方法可能会抛出异常,后面跟上可能要抛出的异常类名 -
throw:手动抛出异常
-
throws:声明可能要抛出的异常,提示方法调用者
三.自定义异常
- 常见异常:RuntimeException,IOException,SQLException,Cla’s’sNotFoundException
- 自定义异常
- Java提供的异常体系,不可能预见所有希望加以报告的错误 - 自定义异常必须从已有的异常类继承
- 建立新的异常类型,最简单的方式是然编译器产生默认构造方法
- 对异常来说,最重要的部分就是它的类名
- 可以为异常类,定义一个接受字符串参数的构造方法,字符串参数描述异常信息。e.getMessage可以获得打印的信息,或者e.printStackTrance可以获得异常信息。