一、概述
异常指的是程序出现了不正常的情况。当程序员在编写代码时,编译时出现的报错或者运行时出现的报错,都可以叫做异常。
我们以学习数组时常见的索引越界异常(ArrayIndexOutOfBoundsException)为例:
以上就是一个异常的描述。
二、异常的体系
1.异常体系结构图
1.1编译时异常和运行时异常在程序上的区别示意图
三、JVM 默认的异常处理方式
如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:
(1)把异常的名称,错误原因及异常出现的位置等信息输出在了控制台。
(2)程序停止执行。
四、异常信息查看
控制台在打印异常信息时,会打印异常类名,异常出现的原因,异常出现的位置。我们调bug时,可以根据提示,找到异常出现的位置,分析原因,修改异常代码。
五、异常处理方式---throws
1.格式
2.代码演示
package ExceptionStudy;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExceptionDemo1 {
public static void main(String[] args) throws ParseException {
/*
public void 方法() throws 异常类名 {
}
*/
System.out.println("开始");
method();
method2();
System.out.println("结束");
}
//编译时异常
public static void method2() throws ParseException {
String s = "2048-08-09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
//运行时异常
public static void method() throws ArrayIndexOutOfBoundsException {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
注意:
(1)这个throws格式是跟在方法的括号后面的。
(2)编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理。
(3)运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理。
六、throw抛出异常
1.格式
throw new 异常 ();
2.说明
这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了。
3.throw与throws的区别
throws | throw |
---|---|
用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
表示声明异常,调用该方法有可能会出现这样的异常。 | 表示手动抛出异常对象,由方法体内的语句处理。 |
4.代码演示
七、try-catch处理异常
1.格式
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
2.执行过程
(1)程序从 try 里面的代码开始执行。
(2)出现异常,就会跳转到对应的 catch 里面去执行。
(3)执行完毕之后,程序还可以继续往下执行。
3.代码演示
package ExceptionStudy;
public class ExceptionDemo3 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
}
}
}
八、异常处理时可能出现的情况
(1)try 中没有遇到问题。
会把try中所有的代码全部执行完毕,不会执行catch里面的代码。
(2)try 中遇到了问题,try 下面的代码执行情况?
try 中遇到了问题会直接跳转到对应的catch语句中,try下面的代码就不会再执行了 当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码。
(3)出现的问题没有被捕获,程序会出现的情况。
那么try...catch就相当于没有写.那么也就是自己没有处理. 默认交给虚拟机处理。
(4)同时有可能出现多个异常的处理方式。
出现多个异常,那么就写多个catch就可以了. 注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面。