目录
一 异常概述
二 异常分类
1、运行时异常
2、编译时异常
三 异常过程分析
四 异常处理
1、为什么要进行异常处理?
2、处理异常的方式?
方法一try-catch-finally捕获异常
方法二使用throw在代码块中抛出异常
方法三使用throws在方法上往上级抛出
五 自定义异常
如何定义
一 异常概述
异常是指程序在执行过程中出现非正常的情况,最终会导致JVM的非正常停止。在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。异常指的并不是语法错误。如果语法错了,则编译不通过,也不会产生字节码文件,根本不能运行。
在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable 类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错 误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。
Throwable类常用方法
public string getMessage():返回异常发生时的详细信息
public string toString():返回异常发生时的简要描述
public string getLocalizedMessage():返回异常对象的本地化信息。使 用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没 有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
public void printStackTrace():在控制台上打印Throwable对象封装的 异常信息
二 异常分类
根据编译时出现的异常还是运行时出现的异常
1、运行时异常
指所有的RuntimeException类以及子类(编译时不报错运行时候就会出现错误)
- RuntimeException类常见的异常子类有:
- ArithmeticException(试图除数为0时)
- NullPointerException(当程序访问一个空对象的成员变量或方法,访问一个空数组的成员时发生。)
- ClassCastException
- ArrayIndexOutOfBoundsException访问的元素下表超过数组长度 分析jvm是如何处理异常的过程
- NumberFormatException数字格式异常!
2、编译时异常
编译异常指的是那些必须处理的异常(运行之前程序就报错)
三 异常过程分析
四 异常处理
1、为什么要进行异常处理?
观察下面代码
public class Demo {
public static void main(String[] args) {
System.out.println("程序开始执行");
System.out.println("打印结果:"+10/0);
System.out.println("程序终止执行");
}
}
运行结果
程序开始执行
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.Demo.main(Demo.java:6)
可以发现如果程序没有正确的处理存在异常,当程序运行发生异常时程序会终止运行,为了让程序发生异常时候也能正常运行,必须引入异常处理语句来完善代码编写。
2、处理异常的方式?
方法一try-catch-finally捕获异常
try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch 块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。同时使用多个catch块处理多个异常,并且捕获多个异常时范围小的要放在范围大的异常之前处理
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。 当在try块或catch块中遇到return语句时,finally语句块将在方法返回 之前被执行。
在以下4种特殊情况下,finally块不会被执行:
1. 在finally语句块中发生了异常。
2. 在前面的代码中用了System.exit()退出程序。 3. 程序所在的线程死亡。 4. 关闭CPU。
方法二使用throw在代码块中抛出异常
方法三使用throws在方法上往上级抛出
public class Demo {
public static void main(String[] args) {
try {
getSum(1, 2, 0);//调用者需要处理抛出的异常
} catch (Exception e) {
e.printStackTrace();
}
}
public static int getSum(int a,int b,int c)throws Exception {
return (a+b)/c;
}
}
五 自定义异常
实际开发中,jdk为我们提供的异常类不能满足我们需求,比如我们需要一个登陆异常类,就得我们自定义登陆异常类
如何定义
1.自定义一个编译时异常:
自定义类 并继承于 java.lang.Exception 。
2.自定义一个运行时异常
自定义类 并继承于 java.lang.RuntimeException