Java新人之路 -- 异常的处理方法

异常的处理方法之:捕获

1.捕获,既对问题进行捕获并设定方法进行处理

定义: 在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。

try{
可能会出现异常的代码块
}catch(异变类型 异常变量){
异常的处理方案
}finally{
最终必然会执行的代码块}

异常捕获实例演示

public static void tryMethod(int[] arr) {
    try {
        int length = arr.length;
        for(int i=0;i<length;i++) {
            if(arr[i]>arr[i+1]) {
                System.out.println(arr[i]);
            }
        }
    }catch(NullPointerException e) {//对try中可能出现的空指针错误进行捕获并处理
        //e.printStackTrace();//默认的打印错误信息及位置的方法
        System.out.println("空指针错误,请检查对象");
    }catch(ArrayIndexOutOfBoundsException e) {//对try中可能出现的下标越界错误进行捕获并处理
        System.out.println("下标越界了");
    }catch(Exception e) {//通常用于捕获未知的不确定的异常
        System.out.println("未知错误");
    }finally{//最终必然执行的代码
        System.out.println("一定会执行");
    }
}

要点一:捕获语法有多种书写形式,可以写成try{}catch{} 或者try{}finally{}的形式

要点二:可以捕获多个异常,完全取决于catch的数量,但是如果存在继承的关系,要把父级放在后面,如Exception

要点三:一个try后面虽然可以跟多个catch,但只会执行先匹配到的catch块。

要点四:当有多个异常的时候对与一直的异常建议针对性的捕获,对于未知的再使用Exception


要点五: 关于finally的执行问题

public static void main(String[] args){
    int count = 6;
    count = test(count);
    System.out.println("count="+count);
}

public static int test(int count){
    try{
        count++;
        int a = 3/0;
        return count++;
    }catch(ArithmeticException e){
	    	e.printStackTrace();   
    }finally{
        return ++count;
    }   
}

结果:
count = 8,且会输出错误代码
若将  int a = 3/0;这一错误代码行注释掉
count = 9,不会输出错误代码

可以发现,如果错误发生,那么try中错误代码行之前的代码会被正常执行,然后在错误发生的时候跳出,执行catch中的代码,最后执行finally;如果错误没有发生,那么try中的代码都会被执行,catch会被跳过,然后再执行finally

所以finally中的代码块是最终必然会执行的代码,通常用于io流关闭或数据库连接对象的关闭。

2.抛出

概念: 当错误发生是,方法创建异常对象并交付当前运行系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。

关键字:

  • throw

关键词用在方法体内,表示抛出异常,由方法体内的语句进行处理,抛出一个异常实例。

  • throws

在方法后面进行声明,表示可能要抛出异常,由该方法的调用者来处理。

声明的是这个方法会抛出这个类型的异常,使它的调用者知道要捕获这个异常。

声明名称为异常的类名或其父类的类名。若不知道异常的类名可以使用异常的总类名 Exception

代码实例

一般的无参抛出

public class ExceptionPractice {
	public static void main(String[] args) throws ArithmeticException {
		myMethod();
	}
public static void method() throws ArithmeticException {
		// 模拟异常处理
		int a = 1/0;//此处会出现虚拟机自动识别的声明
		// 使用throw和throws模拟出隐式的后台操作过程,隐式的过程用显式的展现,但是这个没有错误信息
		throw new ArithmeticException();
}

使用有参的抛出来提供错误信息

public class ExceptionPractice {
	public static void main(String[] args) throws ArithmeticException {
		myMethod();
	}
public static void method() throws ArithmeticException {	
	// 使用有参的构造,添加上错误信息
		throw new ArithmeticException("/ by zero 除数不能为零");
}	

要点一:不能抛出多个异常,当代码块抛出一个异常之后,程序就停止运行

那么如果存在多个异常呢

public class ExceptionPractice {
	public static void main(String[] args) throws ArithmeticException, MyException {
		myMethod();
	}

public static void method() throws ArithmeticException, MyException {//若有多个异常声明,则使用英文逗号将异常类名隔开
        boolean flag = true;
		if(flag) {
			throw new ArithmeticException("除数不能为0");
	    }else {
			throw new NullPointerException("空指针异常");
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值