学习java的第二十二天。。。(异常)

今天学习了异常

import java.util.Scanner;

public class ExceptionDemo01 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		int num1 = in.nextInt();
		System.out.print("请输入除数:");
		int num2 = in.nextInt();
		System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
		System.out.println("感谢使用本程序!");
	}
}

 这是一个计算除法的程序,在执行的时候,如果输入了错误的值,就不行

 比如输入非int类型的数据,就会出现输入不匹配异常

如果输入的除数是0,就会出现算数异常

所以可以改写代码

 

public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入被除数:");
		int num1=0;
		int num2=1;
		if(in.hasNextInt()){
			num1 = in.nextInt();
		}else{
			System.err.println("被除数需要是一个整数");
			return;
		}
		
		System.out.print("请输入除数:");
		if(in.hasNextInt()){
			num2 = in.nextInt();
			if(num2==0){
				System.err.println("除数不能为0");
				return;
			}
		}else{
			System.err.println("除数需要是整数");
			return;
		}
		System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
		System.out.println("感谢使用本程序!");
	}

修改后的代码是可以的。

什么是异常

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

什么是异常处理

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

Java中如何进行异常处理

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
    捕获异常
        try----执行可能产生的异常代码
        catch----捕获异常
        finally-----无论是否发生异常,代码总能执行
    声明异常
        throws----声明方法可能要抛出各种异常
    抛出异常
        throw----手动抛出异常 

使用try-catch块捕获异常

将可能产生异常的代码放入到try语句结构中,可能会有如下三种情况
1)try结构中的代码不会产生异常,那么catch结构中的代码就不会执行
2)try结构中的代码产生了异常,并且catch结构里的代码能够处理这个异常
那么catch处理完异常后,程序继续往下执行
3)try结构中的代码产生了异常,但是catch结构的代码不能处理这个异常,程序就会被中断

        try{
			Scanner in = new Scanner(System.in);
			System.out.print("请输入被除数:");
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
			System.out.println("感谢使用本程序!");
		}catch (InputMismatchException e){
			System.out.println("输入不匹配");
		}
		System.out.println("程序执行完毕");

try-catch-finally块

try结构中的代码产生了异常,但是catch结构的代码不能处理这个异常,依然会中断程序的执行,但是我希望不管产生的异常能不能处理, "程序执行完毕"这行代码都会输出

解决方法 在catch结构后面添加一个finally语句块,不管前面的异常有没有处理,finally语句块中的代码都会执行finally语句块中的代码都会执finally语句块中的代码唯一不执行的情况是在前面的try结构或者catch结构中存在退出系统的语句System.exit(1)。

        try {
			Scanner in = new Scanner(System.in);
			System.out.print("请输入被除数:");
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
			System.out.println("感谢使用本程序!");
			System.exit(1);
		} catch (ArithmeticException e) {
			// 这里的catch只能处理算数异常,不能处理输入不匹配异常
			System.err.println("输入不匹配");
			System.exit(1);
		} finally {
			System.out.println("程序执行完毕");
		}

在try结构中或者catch结构中存在return,finally结构里的语句仍然会执行
try结构或者catch结构中的代码,在执行到return语句时,会先去看有没有finally语句,有--输出里面的代码,在返回执行return,没有执行return

printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程 

 

多重catch块

引发多种类型的异常,可以在try结构后面写多个catch语句块排列catch 语句的顺序:先子类后父类发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句

        try {
			Scanner in = new Scanner(System.in);
			System.out.print("请输入被除数:");
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
			System.out.println("感谢使用本程序!");
			return;
		} 
		catch (ArithmeticException e) {
			// 这里的catch只能处理算数异常,不能处理输入不匹配异常
			System.err.println("不能为0");
			return;
		}catch(InputMismatchException e){
			System.out.println("输入不匹配");
		}
		catch(Exception e){
			//写在最后的位置
			System.out.println("产生了一个异常");
		}
		finally {
			System.out.println("程序执行完毕");
		}

 这里第三个catch结构的Exception e属于是顶尖硬货,啥都能处理,要放在最后的位置

常见的异常类型

void printStackTrace()-----输出异常的堆栈信息、
String getMessage()-----返回异常信息描述字符串,是printStackTrace()输出信息的一部分
Exception -----异常层次结构的父类
ArithmeticException-----算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException-----数组下标越界
NullPointerException-----尝试访问 null 对象成员
ClassNotFoundException-----不能加载所需的类
IllegalArgumentException-----方法接收到非法参数
ClassCastException-----对象强制类型转换出错
NumberFormatException-----数字格式转换异常,如把"abc"转换成数字

声明异常

throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开

public void exceptionMethod() throws ArithmeticException,InputMismatchException{
		try {
			Scanner in = new Scanner(System.in);
			System.out.print("请输入被除数:");
			int num1 = in.nextInt();
			System.out.print("请输入除数:");
			int num2 = in.nextInt();
			System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
			System.out.println("感谢使用本程序!");
		}finally{
			System.out.println("程序执行完毕");
		}
	}

 如果在一个方法体中抛出了异常,如何通知调用者?
    方式1:调用者处理异常
    方式2:调用者继续声明异常
        main()方法声明的异常由Java虚拟机处理

抛出异常

使用throw抛出异常

throw与throws 
    throw
        生成并抛出异常
        位于方法体内部,可作为单独语句使用
        抛出一个异常对象,且只能是一个
    throws
        声明方法内抛出了异常
        必须跟在方法参数列表后面,不能单独使用
        声明抛出异常类型,可以跟多个异常

自定义异常

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

使用自定义异常的步骤
    1.定义异常类(继承Throwable类、继承Excepion 或者RuntimeException)
    2.编写构造方法、继承父类的实现
    3.实例化自定义异常对象
    4.使用throw抛出

异常链

A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新异常呢?
    抛出原有的异常
        A方法与B方法进行了关联,不便于代码的修改和扩展
    抛出新的异常
        异常链创建了新的异常但却保留了原有异常的信息

异常处理原则

    异常处理与性能
    异常只能用于非正常情况
    不要将过于庞大的代码块放在try中
    在catch中指定具体的异常类型
    需要对捕获的异常做处理

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放在糖果旁的是我很想回忆的甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值