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;
}
结果如下:
看这就是我们自己抛出的异常
下一篇考虑发一个自定义异常,自定义异常是比较重要的,所以我们单独再开一篇博客来讲