常见的异常类型:
- ArrayIndexOutOfBoundsException 数组下标越界异常
- NullPointerException (NPE) 空指针异常 当引用数据类型没有引用某个内存空间时 它的值就是null,那么如果null值去使用方法、属性则会报出此异常
- ClassCastException 类型转换异常 多态时尤其可能出现,不确定多态的具体类型时 转换可能会出现问题
- ClassNotFoundException 类找不到异常
- ArithmeticException 算术异常 除数为0
- InputMismatchException 输入不匹配异常
一、了解异常的概念
异常是指在程序(生活/计算机)的运行过程中所发生的不正常的事件,它会中断正在运行
的程序。
public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 10;
int j = 0;
int temp = i/j; //此处产生异常
System.out.println(temp);
System.out.println(“*计算结束***“);
}
}
// 运行结果:*计算开始***
/*Exception in thread “main” java.lang.ArithmeticException: / by zero
at Exp.ExceptionDemo01.main(ExceptionDemo01.java:8)*/
一旦产生异常之后,异常之后的语句并不会执行,而是直接结束程序,并将错误报告给用户,
如果使用if语句,来判断是否有异常出现,程序可读性就差了很多
为什么使用异常?
更加快速的发现代码中的错误,定位错误,以便程序的修改和调试。
二、Java异常处理机制
1.异常处理
Java提供了一套异常处理机制来解决我们使用过多的if判断问题(补不全、代码维护性变差、阅读困难)。
由下方的这些关键词可以让我们的程序遇到异常时候更加健壮。
Java处理异常的五个关键字:try、catch、finally、throw和throws
2.使用try-catch处理异常
try{
// 可能会出现异常的代码
}catch(异常类型){
// 对异常的修复/处理
}
public static void main(){
Scanner input = new Scanner(System.in);
try {
// 可能出现问题的代码
System.out.print("请输入第一个整数:");
int num1 = input.nextInt();
System.out.print("请输入第二个整数:");
int num2 = input.nextInt();
// 计算除法
int num3 = num1 / num2;
System.out.println(num1+"/"+num2+"="+num3);
}catch(Exception e) { // 能捕获的异常类型
System.out.println("出现错误:被除数和除数必须是整数,除数不能为0!");
}
}
3.使用try-catch-finally处理异常
try{
// 可能会出现异常的代码
}catch(异常类型){
// 对异常的修复/处理
}finally{
// 最终执行的代码
}
4.使用多重catch处理异常
try{
// 可能会出现异常的代码
}catch(异常类型1){
// 对异常的修复/处理
}catch(异常类型2){
// 对异常的修复/处理
}....
public static void main(){
Scanner input = new Scanner(System.in);
try {
// 可能出现问题的代码
System.out.print("请输入第一个整数:");
int num1 = input.nextInt();
System.out.print("请输入第二个整数:");
int num2 = input.nextInt();
// 计算除法
int num3 = num1 / num2;
System.out.println(num1+"/"+num2+"="+num3);
}catch(InputMismatchException e) { // 能捕获的异常类型
System.out.println("对不起!请输入整数!");
}catch (ArithmeticException e) {
System.out.println("对不起!除数不能为0!");
}catch (Exception e) {
System.out.println("服务器繁忙!");
}
}
System.out.println("程序结束!");
5.使用throw和throws抛出异常
在Java程序中使用throws声明抛出异常:
public static void main(String[] args) {
try {
divide();
}catch(InputMismatchException e){
System.out.println("被除数和除数必须是整数。");
}catch(ArithmeticException e) {
System.out.println("除数不能为零。");
}catch(Exception e) {
System.out.println("其他未知异常。");
}finally {
System.out.println("感谢使用本程序!");
}
}
public static void divide()throws Exception{
Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d/%d=%d",num1,num2,num1/num2));
}
throw和throws的区别?
- throw表示抛出异常 抛出异常后面要跟随异常的对象 用于告知调用者异常的信息(异常对象)后期常用来抛出自定义异常。
- throws表示声明异常 它是在方法声明上进行指定的,一般表示此方法不处理异常而是向上抛出
6.自定义异常
三、使用日志记录异常的情况
步骤:
- 下载相应的工具包(sdk):他们一般帮助我们将其打成了jar包
- 在Java项目中创建一个文件夹(lib)存放jar包
- 将jar包引入为类库(在jar包上右键 -> build path -> add to build path)
- 根据要求和使用说明进行使用
- 准备一个日志配置文件`log4j.properties`配置日志运行的规则
- 使用API来进行日志记录
- info() 记录普通信息
- debug() 记录方便我们调试的信息
- error() 记录错误信息