Java入门 面向对象(异常) (第二十二天)

什么是异常

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

生活中:
   生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活

遇到代码发生异常修改代码时的弊端:

1、代码臃肿 
2、程序员要花很大精力“堵漏洞”
3、程序员很难堵住所有“漏洞”

这时就可以使用异常处理机制

如何进行异常处理 

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

 

try-catch块

使用try-catch块捕获异常,分为三种情况:

异常是一种特殊的对象,类型为
java.lang.Exception或其子类 

 异常对象常用的方法

1)void printStackTrace():输出异常的堆栈信息

2)String getMessage():返回异常信息描述字符串,是printStackTrace()输出信息的一部分

e.printStackTrace();

常见的异常类型

1)Exception :异常层次结构的父类
2)ArithmeticException:算术错误情形,如以零作除数
3)ArrayIndexOutOfBoundsException:数组下标越界
4)NullPointerException:尝试访问 null 对象成员
5)ClassNotFoundException:不能加载所需的类
6)lllegalArgumentException:方法接收到非法参数
7)ClassCastException:对象强制类型转换出错
8)NumberFormatException:数字格式转换异常,如把"abc"转换成数字

存在return的try-catch-finally块

try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一

多重catch块  

引发多种类型的异常:
   ■排列catch 语句的顺序:先子类后父类 
   ■发生异常时按顺序逐个匹配
   ■只执行第一个与异常类型匹配的catch语句

声明异常

如果在一个方法体中抛出了异常,如何通知调用者?

throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
方式1:调用者处理异常
方式2:调用者继续声明异常
          main()方法声明的异常由Java虚拟机处理

抛出异常

除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
使用throw抛出异常
throw与throws 

throw

throws

生成并抛出异常

声明方法内抛出了异常

位于方法体内部,可作为单独语句使用

必须跟在方法参数列表后面,不能单独使用

抛出一个异常对象,且只能是一个

声明抛出异常类型,可以跟多个异常

异常体系结构 

 

自定义异常 

1)当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类
2)使用自定义异常的步骤

1、定义异常类
2、编写构造方法,继承父类的实现
3、实例化自定义异常对象
4、使用throw抛出

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

 异常链

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

异常处理原则

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

总结

1)异常分为Checked异常和运行时异常
      ■Checked异常必须捕获或者声明抛出
      ■运行时异常不要求必须捕获或者声明抛出
2)try-catch-finally中存在return语句的执行顺序
3)finally块中语句不执行的情况
4)throw和throws关键字的区别

代码:

 例一:

package AnomalyDemo01;

import java.util.Scanner;

public class ExceptionDemo01 {

	public static void main(String[] args) {
		/*
		 * 将可能产生异常的代码放入到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 (ArithmeticException e) {
//			System.out.println("除数不能为0");
//			e.printStackTrace();
			
		}
		System.out.println("程序执行完毕");
		
	}

}

 例二:

package AnomalyDemo01;

import java.util.Scanner;

public class ExceptionDemo02 {

	public static void main(String[] args) {
		/*
		 * 1)当try结构中的代码产生的异常,catch结构不能处理,依然会中断程序的执行,但是我希望不管产
		 * 生的异常能不能处理,“程序执行完毕”这行代码都会输出在catch结构后面添加一个finally语句块,
		 * 不管前面的异常有没有处理,finally语句块中的代码都会执行。
		 * 
		 * 2)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) {
			System.out.println("除数不能为零");
			System.exit(1);
		}finally{
			System.out.println("程序执行完毕");
		}

	}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值