1、认识异常
异常概念:异常是指在程序运行过程中所发生的不正常事件。
2、java中异常体系结构
java中异常有很多异常类型,java中所有异常类型都是Throwable类的子类,它有两个子类:Errow类和Exception类。
- Error类:表示仅靠程序本省无法恢复的严重错误,如内存溢出,虚拟机错误等。
- Exception类:是java应用程序抛出和处理的非严重错误。
Exception类可以分为两大异常:
- 运行是异常:包括RuntimeException及其所有的子类
- Checked异常:非运行时异常,如SQLException等。
重点关注运行时异常:以下是一些常见的异常
异常 | 说明 |
Exception | 所有运行时异常的父类 |
ArithmeticException | 算术错误异常,如以0作为除数 |
ArrayIndexOutOfBoundsException | 数组越界 |
NullPotinterException | 空指针异常 |
ClassNotFountdException | 不能加载所需的类 |
InputMismatchException | 类型不匹配 |
IiiegalArgumentExcepiton | 方法接到非法参数 |
ClassCastException | 对象强制类型转换错误 |
NumberFormatException | 数字格式转换异常,如把“abc”转换成数字123 |
3.Java中异常处理机制
Java中异常处理通过5个关键字来实现:try,catch,finally,throw,thorws.
(一):使用try-catch处理异常
代码如下:
public class Test3 {
public static void main(String[] args) {
try {
Scanner input = new Scanner(System.in);
System.out.println("请输入被除数:");
int num1 = input.nextInt();
System.out.println("请输入除数:");
int num2 = input.nextInt();
// 使用格式化字符串和参数返回一个格式化字符串
System.out.println(String.format("%d/%d=%d", num1, num2, num1 / num2));
System.out.println("感谢使用本程序!");
} catch (Exception e) { // 异常捕获
System.out.println("出现错误:被除数和除数必须是整数," + "除数不能为0");
e.printStackTrace(); // 异常对象e,打印异常堆栈信息(方便调试)
}
}
}
注意:void printSitackTarace():输出异常的堆栈信息。
String getMessage():返回异常信息描述字符串,他也是printSitackTarace()输出信息的一部分。
(二):try-catch-finall处理异常
在catch后面加上一个finally块,表示是否发生异常,finally语句块都会执xing行
(除非catch块中执行了System.exit(1)语句,退出了java虚拟机)
try-catch-finally结构中try语句块是必须存在的,catch,finally语句块可以自己选择,但是两者必须有一种存在!
注意:如果在catch语句块中加上了return语句,那么finally语句块也会执行。
执行的顺序是:先执行catch语句块中return之前的语句------再执行finally语句-------最后执行catch语句块中的return语句
(三):使用多重cathc处理异常
public class Test6 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1=input.nextInt();
System.out.println("请输入除数:");
int num2=input.nextInt();
//使用格式化字符串和参数返回一个格式化字符串
System.out.println(String.format("%d/%d=%d",num1,num2,num1/num2));
//多重catch的使用
} catch (InputMismatchException e) { //捕获类型不匹配异常
System.err.println("被除数和除数必须是整数!");
} catch (ArithmeticException e){ //捕获算术异常
System.err.println("除数不能为0!");
} catch (Exception e) {
System.err.println("其它未知异常。");
} finally {
System.out.println("感谢使用本程序!");
}
}
}
//注意:多重catch的使用,一定是先从子类开始,最后到父类Exception类
4.使用throws声明异常
- 通过try-catch捕获并处理异常。
- 通过throws继续声明异常。如果调用者不知道如何处理该异常,可以继续通过throws声明异常,让上一级调用者处理异常。如果上一级,或者一直不处理,main()方法声明的异常将由java虚拟机处理。
5.使用throw抛出异常
- throw关键字可以自行抛出异常,把问题交给调用者去解决。
6.throw和throws的区别
区别 | throw | throws |
作用 | throw用于程序员自动抛出异常 | 声明该方法内抛出了异常 |
位置 | throw位于方法体内部,可以作为单独语句使用 | 必须跟在方法参数列表的后面,不能单独使用 |
内容 | throw抛出一个异常对象 | throws后面跟异常类,可以跟多个 |
7.Java中,可以自定义异常类,一般需要继承Exception或者RuntimeException类。