Java异常

目录

一、什么是异常?

二、什么是异常处理

三、Java中如何进行异常处理

1、try ----catah块捕获异常,分为三种情况

2、多重catch块

 3、finally块

 4、声明异常-----throws

5、抛出异常---------throw

四、Error与Exception的区别

五、自定义异常

面试题:


一、什么是异常?

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

程序运行 --------->异常------->程序中断运行

二、什么是异常处理

Java编程语言使用异常处理机制为程序提供了错误处理的能力

程序中预先设置好对付异常的处理办法-------->程序运行------->异常------->对异常进行处理--------> 处理完毕,程序继续运行

三、Java中如何进行异常处理

Java中的异常处理是通过5个关键字来实现的:

try、catah、finally、throw、throws

try:执行可能产生异常的代码

catch:捕获异常

finally: 无论是否发生异常,代码总能执行

throws:声明方法可能要抛出的各种异常

throw:手动抛出异常

1、try ----catah块捕获异常,分为三种情况

第一种情况 :try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略

 方法:

public void method(){
try {
  // 代码段(此处不会产生异常)
} catch (异常类型 ex) {
      // 对异常进行处理的代码段
}
 // 代码段
}

 实例:

public class Math {
    static Scanner sc = new Scanner(System.in);
    public void show(){
        System.out.print("请输入被除数:");
        int num1 = sc.nextInt();
        System.out.print("请输入除数:");
        int num2 = sc.nextInt();
        try {
            System.out.println("结果是:" + num1 +"/"+ num2 + "=" + num1 / num2);
        }catch (Exception exception){
            System.err.println("程序出错!除数不能为0");
            exception.printStackTrace();
        }
    }

 第二种情况 :try语句块在执行中遇到异常,那么在try块中其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,则相应的catch块将会被执行

public void method(){
try {
      // 代码段 1
      // 产生异常的代码段 2
      // 代码段 3
} catch (异常类型 ex) {
      // 对异常进行处理的代码段4
}
// 代码段5
}

 第三种情况 :try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常类型不匹配,程序会中断。

public void method(){
try {
     // 代码段 1
     // 产生异常的代码段2
     // 代码段 3
} catch (异常类型 ex) {
     // 对异常进行处理的代码段4
}
// 代码段5
}

 catch块中处理异常可以加入用户自定义处理信息

异常对象常用的方法处理信息

方法名说明

void printStackTrace()

输出异常的堆栈信息

String getMessage()

返回异常信息描述字符串,

printStackTrace()输出信息的一部分

常见的异常类型

异常类型说明

Exception

异常层次结构的父类

ArithmeticException

算术错误情形,如以零作除数

ArrayIndexOutOfBoundsException

数组下标越界

NullPointerException

尝试访问 null 对象成员

ClassNotFoundException

不能加载所需的类

IllegalArgumentException

方法接收到非法参数

ClassCastException

对象强制类型转换出错

NumberFormatException

数字格式转换异常,如把"abc"转换成数字

2、多重catch块

一段代码可能会引发多种类型的异常,在上面计算并输出商的示例中,其实至少存在两种异常情况,输入非整数内容和除数为0,而我们统一按照Exception类型捕获。如果要分别捕获,就可以使用多重catch块。

引发多种类型的异常

1、排列catch 语句的顺序:先子类后父类

2、发生异常时按顺序逐个匹配

3、只执行第一个与异常类型匹配的catch语句

方法:

public void method(){
try {
     // 代码段
     // 产生异常(异常类型2)
} catch (异常类型1 ex) {
     // 对异常进行处理的代码段
} catch (异常类型2 ex) {
     // 对异常进行处理的代码段
} catch (异常类型3 ex) {
     // 对异常进行处理的代码段
}
// 代码段
}

 实例:

public class Test {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try {
            System.out.print("请输入被除数:");
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println("准备执行除法运算...");
            System.out.println(String.format("%d / %d = %d", num1, num2, num1 / num2));
            System.out.println("除法运算完毕,已产生结果...");
            /*return;*/
            System.exit(1);
        }catch (NumberFormatException exception){
            exception.printStackTrace();
            System.err.println("程序异常!异常原因:输入的不是数字!");
        }catch (ArithmeticException exception){
            exception.printStackTrace();
            System.err.println("程序异常!异常原因:除数为0!");
        }catch (Exception exception){
            System.err.println("程序异常!");
            exception.printStackTrace();
        }finally {
            System.out.println("..........");
        }
        System.out.println("感谢使用本程序!");

 3、finally块

是否发生异常都会执行

public void method(){
try {
     // 代码段 1
     // 产生异常的代码段 2
    } catch (异常类型 ex) {
     // 对异常进行处理的代码段3
     return;
    }finally{
      // 代码段 4
    }
}

 4、声明异常-----throws

Java语言中通过关键字throws声明某个方法可能抛出的各种异常。

throws可以同时声明多个异常,多个异常用逗号隔开。

如果把计算并输出商的任务封装在divide()方法中,并在方法的参数列表后通过throws声明了异常,然后在main()方法中调用该方法,此时main()方法就知道divide()方法中抛出了异常,可以采取以下两种方式进行处理。

方式1:调用者通过try-catch捕获并处理异常。

方式2:调用者通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常

main()方法声明的异常将由Java虚拟机来处理。

public class Test7 {
	public static void divide() throws Exception {
		  //可能出现异常的代码
	}
	public static void main(String[] args) {
		 try {
			divide();
		 } catch (Exception e) {
			e.printStackTrace();
		 }
	}
//	public static void main(String[] args) throws Exception {
//		 divide();
//	}
}

5、抛出异常---------throw

Java语言中通过关键字throw来自行抛出异常。

public class Person {
	private String name = "";   // 姓名
	private int age = 0;   // 年龄
	private String sex = "男";  // 性别
	public void setSex(String sex) throws Exception {
		if ("男".equals(sex) || "女".equals(sex))
			this.sex = sex;
		else {
			throw new Exception(“性别必须是\"男\"或者\"女\"!");
		}
	}
}

四、Error与Exception的区别

都是继承于Throwable这个类

Error是java程序在编译阶段出现的问题,代码将无法通过编译

Exception是Java程序在运行阶段时才出现的问题,能通过编译,但是不能完整运行

五、自定义异常

JDK 中的异常类型不能满足程序的需要时,可以自定义异常类。

使用自定义异常的步骤

1.定义异常类:继承Throwable类、继承Excepion 或者RuntimeException

2.编写构造方法,继承父类的实现

3.实例化自定义异常对象

4.使用throw抛出

异常处理原则

1、异常处理与性能

2、异常只能用于非正常情况

3、不要将过于庞大的代码块放在try

4、在catch中指定具体的异常类型

5、需要对捕获的异常做处理

面试题:

1、try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序?

答:执行,先执行finally块,后执行return语句

try-catch- finally块中, finally块唯一不执行的情况是什么?

除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);),否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理的finally块总是会被执行的

2、请说出throwthrows的区别?

throwthrows的区别表现在以下三个方面

作用不同: throw用于在程序中抛出异常; throws用于声明在该方法内抛出了异常。

使用的位置不同:throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表后面,不能单独使用。

内容不同: throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值