【异常的学习】


一、异常是什么?

Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。
在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如用户的坏数据、试图打开一个不存在的文件等。为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。

二、异常的体系结构

请添加图片描述
请添加图片描述

Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。下面将详细讲述这些异常之间的区别与联系:

1、Error与Exception
Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
2、运行时异常和非运行时异常
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。


三.异常处理

3.1 try-catch

如果一段代码可能会抛出异常—编译器检测或程序员认为会,就需要将这些代码放在try catch块中,如下代码示例;这很好理解:try指“尝试”执行可能出现异常的代码,如果成功,则乎略备用方案,即(B)区的代码;但如失败,代码会catch(捕获)到一个异常对象,放弃(A)计划,开始执行(B)计划!

import java.util.Scanner;

/**
 * 演示除数为0的情况
 * @author pactera
 *
 */
public class TestException {
	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("计算结果如下:");
			System.out.println(num1+"/"+num2+"="+(num1/num2));
            System.out.println("========程序结束!!!!=============");
		}catch(ArithmeticException e){ //catch是捕获异常,并进行处理
			//需要注意,我们这个catch捕获的只能是ArithmeticException异常或者其子类异常,对其他异常不捕获
			e.printStackTrace();//可以在控制台打印详细的异常信息,在开发阶段使用,便于调试代码
//异常的处理,我们简单输出一句话,但是在真实的项目中,不能只是输出一句话,而是要做相应的处理
			System.out.println("你丫的没读过小学吗?不知道除数不能为0吗");
		}
       System.out.println("============程序结束!!!!==================");
	}
}

需要注意的是:

1.try catch块中变量做用域:try块中定义的变量符合我们前面所讲的变量做用范围的规则,即变量只能在限定自己最近的一对大括号内使用;即try catch块内一对大括号中定义的变量不能在后面的代码块内使用;
2.方法返回值:如果方法有定义的返回值,这个方法就有可以在正常执行时有一个返回值,或在catch到异常时有个返回值—不能仅仅只在try块中return一个返回值。
3.要注意的是,并不是所有的异常都强制需要try catch,在java中,异常分为强制检测和非强制检测二种:
4.非强制检测在编译时,不需要try catch,但如因程序员编码时逻辑错误,在运行时就会抛出,如下代码:

3.2 try-catch-finally

对于上面的代码,我们再来做一点改进,我想让上面的代码的”程序结束”这句话不管是否发生异常,而且不管是否catch到相同的异常,我都要输出,这是很有必要的,那这些必须关闭的资源应该放在那里呢?放在try中,不行吧,如果出现异常,那try中的代码就不会执行了,如果放在catch中,那如果ctach捕获的异常不一样,那也不会执行,所以java就给我们准备了这样一个东西,这就是finally块,finally块表示程序不管是否发生异常,总会执行.现在我们把上面的代码进行优化:

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * 演示除数为0的情况
 * 
 * @author pactera
 * 
 */
public class TestException {
	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("计算结果如下:");
			System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
			System.out.println("======代码正常执行完==========");
		} catch (ArithmeticException e) { // catch是捕获异常,并进行处理
			// 需要注意,我们这个catch捕获的只能是ArithmeticException异常或者其子类异常,对其他异常不捕获
			e.printStackTrace();// 可以在控制台打印详细的异常信息,在开发阶段使用,便于调试代码
			// 异常的处理,我们简单输出一句话,但是在真实的项目中,不能只是输出一句话,而是要做相应的处理
			System.out.println("你丫的没读过小学吗?不知道除数不能为0吗");
		} catch (InputMismatchException e) {
			System.out.println("你丫不知道什么是数字吗,乱输个啥");
		} catch (Exception e) { // Exception是所有异常类的父类,所以要写在最后
			System.out.println("哎,我也不知道怎么办了");
		} finally {//不管是否异常都会执行
			System.out.println("================程序结束!!!!=====================");
		}
	}
}

3.3 throw 与throws

throw表示抛出异常,语法是:

 throw new 异常类型([异常信息]);

比如说: throw new Exception(“抛个异常玩玩”);

throws表示用来声明方法可能会抛出那些异常: 语法是:

throws 异常类型1,异常类型2

代码演示:

//定义一个除法的方法,并声明异常
	public int division(int num1 ,int num2) throws ArithmeticException{
		if(num2 == 0){
			//抛出异常,如果抛出异常,则抛出异常后面的代码不会执行
			throw new ArithmeticException("除数不能为0");
		}
		return num1/num2;
	}

四.自定义异常

4.1 创建异常类

创建自定义异常,需要继承Exception 或其子类。习惯上包装一下父类的构造方法。

public class MyException extends Exception {
    public MyException() {
        super();
    }
    public MyException(String msg) {
        super(msg);
    }
    public MyException(Throwable cause) {
        super(cause);
    }
    public MyException(String msg, Throwable cause) {
        super(msg, cause);
    }
}

4.2使用自定义异常类

public String[] createArray(int length) throws MyException {
    if (length < 0) {
        throw new MyException("数组长度小于0,不合法");
    }
    return new String[length];
}

五.总结

以上就是我对异常学习的内容,异常学起来相对比较简单,在今后的学习中更要努力,锲而不舍,金石可镂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值