Java异常详解
文章目录
前言
开发中会遇到各种问题程序运行不下去,我们称之为异常,我们也可以不合逻辑的运行抛出异常
提示:以下是本篇文章正文内容,下面案例可供参考
一、概念
程序在运行时的时候,发生的不正常事件,就是所谓的异常。
二、异常分类
Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。
Error:JVM、硬件、执行逻辑错误,不能手动处理。
常见错误: *Error、OutOfMemoryError等。
Exception:程序在运行和配置中产生的问题,可处理。
- RuntimeException:运行时异常,可处理,可不处理。
- CheckedException:检查时异常,必须处理
代码如下(示例):
/**
4 * 异常和错误的区别:
5 */
6 public class Demo {
7 public static void main(String[] args) {
8 //int[] arr = new int[3];
9 //System.out.println(arr[0]);
10 //数组越界异常,可以处理
11 //System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsException: 3
12
13 //错误:
14 int[] arr2 = new int[1024*1024*1024];
15
16
17 }
18
检查异常:由编译器能够检查出来的异常。外部原因导致的异常,程序中必须处理。
- FileNotFoundExcetpion
- IOException
- SQLException
运行时异常:RuntimeException,也叫非受检异常,编译器不检查的异常。往往一些代码的逻辑问题。 - NullPointerException
- ArrayIndexOutOfBoundsException//数组越界
- ArithemicException
- ClassCastException
- NumberFormatException
代码如下(示例):
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7
8 public class Demo5 {
9 public static void main(String[] args) {
10
11 int i=10;
12 int j = 0;
13 try{
14 //int div =i/j;//运行时异常,运行的过程中抛出的异常,
15 //可能抛出异常的代码
16 //System.out.println("div:"+div);
17 int k = Integer.parseInt("xxxx");
18 }catch (ArithmeticException e){
19 //异常的处理
20 //System.out.println();
21 e.printStackTrace();
22 }catch (NumberFormatException e){
23 e.printStackTrace();
24 }
25
26 System.out.println("end...........");
27
28
29 //SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
30 //sdf.parse("wowowwo");//检查异常
31
32 // File file = new File("c:\\a.jpg");
33 // FileInputStream fis = new FileInputStream(file);
34
35
36 }
37 }
三、异常产生和传递
异常产生
- 自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常。
- 手动抛出异常:语法:throw new 异常类型(“实际参数”)。
- 产生异常结果:相当于遇到 return语句,导致程序因异常而终止。
异常传递
- 异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)。
- 受查异常:throws 声明异常,修饰在方法参数列表后端。
- 运行时异常:因可处理可不处理,无需声明异常。
四、异常的处理
捕获异常:try,catch,finally
语法规则:
try{
2 //可能产生异常的代码
3 }catch(异常类型1 e){
4 //捕获异常的处理
5 }catch(异常类型2 e){
6 //捕获异常的处理
7 }finally{
8 //无论程序是否产生异常,此处的代码一定会被执行。
9 //比如说:释放资源,删除临时文件等。。。
10 }
注意点:
1.一个try可以匹配多个catch语句
2.如果try中产生了异常对象,那么会跳出try,进到相应的catch中处理异常,从上向下匹配。
3.如果是多个catch语句,那么小的异常捕获处理写前面,大的异常捕获处理写后面。
4.finally是可选的.
声明异常throws
方法级别上,向外抛出异常。
方法的声明上就要通过throws关键字声明抛出异常:
public static void test1(int i,int j)throws NullPointerException{
2
3 }
4 [修饰符1,修饰符2.。。] 返回值类型/void 方法名(参数列表) 异常的声明{
5
6 }
按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)。
运行时异常的抛出,不一定要处理
检查异常的抛出,必须处理
Exception和RuntimeException的区别
1.RuntimeException是Exception的子类。
2.Exception包含了受检异常,所以抛出Exception以及受检异常时,代码中一定要给与处理。如果抛
出的是RuntimeException(运行时异常,非受检)以及它的子类异常,程序中不一定非要处理。
3.重写的时候,子类不能抛出比父类更大的异常
throw关键字
throw和throws的区别
1.throws,用于定义方法的时候,声明该方法向外抛出异常。
2.throw,主动抛出一个异常的对象。打断程序的执行。配合trycatch,或者throws来使用。
Exception exception = new Exception("我自定义的异常。。");
2
3 try {
4 throw exception;//自己主动抛出的异常
5 } catch (Exception e) {
6 e.printStackTrace();
7 }
8
9 System.out.println("main......end.....");