异常的处理

1、捕获
直接上代码块:

try{

}catch(异常类型1 异常变量){

}catch(异常类型2 异常变量){

} finally{

}

程序会根据你抛出的异常类型,去选择进入哪一个catch块
Try里面的代码 当try里面的代码抛异常的时候,马上就会进入对应的catch,try剩下的代码不再执行
Catch里面的代码 当try里面的代码没有抛出异常,或者抛出的异常和catch不匹配时,catch中的代码不执行
当有多个catch的时候,前面的catch的异常类型不能包含后面的catch
我们吃个栗子,在编辑器输入如下代码:

/** 

* @author Hercules

* @version 创建时间:2020年2月17日 上午9:11:05 

* 异常练习类

*/
public class Exception {
    
	public static void main(String[] args) {
		try {
			System.out.println(1/0);
			Object [] os = new Object[5];
			System.out.println(1);
			os[6] = null;
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();//打印异常信息
			System.out.println("处理数组越界");
		} catch (RuntimeException e) {
			System.out.println("处理除数为0");
		}
	}
	
}

结果如下:
在这里插入图片描述
可以看到try里面的代码当发生异常的时候不会再执行,catch里面的代码也不一定会执行。

不过还有一个finally,相信如果看过我前面的博客也会记得,我在关流的时候往往会引入一个finally。这个finally里面的代码无论是否抛出异常都会执行,即使前面加了return也会执行

下面我们一起来看一道面试题:(可以先不看下面的结果,猜一猜这段代码的返回值是多少,注意是返回值而不是输出。)

public static int m2() {
		try {
			System.out.println(1/1);
			Object [] os = new Object[5];
			os[2] = null;
			return 1;
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();//打印异常信息
			System.out.println("处理除数为0啦");
		} catch (RuntimeException e) {
			System.out.println("处理数组越界");
			return 2;
		} finally {
			System.out.println("finally");
			return 3;
		}
	}

这个面试题返回值如下:
在这里插入图片描述

2、抛出
在方法的参数列表后面加上throws抛出异常,可以同时抛出多个异常进行处理
例如如下代码:

public static void m3() throws FileNotFoundException,IOException {
		InputStream is = new FileInputStream("a.txt");
		is.read();
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/** 

* @author Hercules

* @version 创建时间:2020年2月17日 上午9:50:41 

* 类说明 

*/
public class Exception2 {
	public static void main(String[] args) {
		try {
			m1();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void m1() throws FileNotFoundException, IOException {
//		int a = m2();
//		System.out.println(a);
		m3();
	}
	
	public static void m3() throws IOException,FileNotFoundException {
		InputStream is = new FileInputStream("a.txt");
		is.read();
	}
}

这里也是一个抛出异常的例子,m3无法处理异常就抛给m1,而后m1自己也无法处理,于是又抛出给main方法,main方法中有trycatch语句进行处理。

下面我们进入下一个问题:

继承时抛出异常的问题
子类重写父类方法的时候,子类的异常不能比父类的更多
比如下面的错误演示我特意把错误加粗了的诸位。

public class A {

	public void name(){
		
	}
}
package exception;
import java.io.FileNotFoundException;
public class B extends A{
	@Override
	public void name() throws NullPointerException,FileNotFoundException {
		
	}
}

可以看到这里子类的异常就比父类多,这是错误的。

自己抛异常:
当我们自己的程序出现逻辑问题时,可以选择自己抛出异常

public static void m1()  {
	division(1,0);
}

public static int division(int a,int b) {
	if(b == 0) {
		throw new ArithmeticException("除数b不能为0");
	}
	return a/b;
}

结果如下:
在这里插入图片描述
看这就是我们自己抛出的异常
下一篇考虑发一个自定义异常,自定义异常是比较重要的,所以我们单独再开一篇博客来讲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值