在程序设计和运行的过程中, 发生错误是不可避免的. 尽管 Java 语言的设计从根本上提供了便于写出整洁, 安全代码的方法, 并且程序员也尽量地减少错误的产生, 但是使程序被迫停止的错误的存在仍然不可避免. 为此, Java 提供了异常处理机制来帮助程序员检查可能出现的错误, 以保证程序的可读性和可维护性
异常(Exception)
异常 (Exception) 又称为例外, 是一个在程序执行期间发生的事件, 它中断正在执行的程序的正常指令流. 为了能够及时有效地处理程序中的运行错误, 必须使用异常类. 错误可能产生于程序员没有预料到的各种情况, 或者超出程序员可控范围的环境, 例如用户的坏数据, 试图打开一个不存在的文件等. 为了能够及时有效地处理程序中的运行错误, Java 专门引入了异常类
异常原因
一, Java 内部错误发生异常, Java 虚拟机产生的异常.
二, 编写的程序代码中的错误所产生的异常, 例如空指针异常, 数组越界异常等. 这种异常称为未检査的异常, 一般需要在某些类中集中处理这些异常.
三, 通过 throw 语句手动生成的异常, 这种异常称为检査的异常, 一般用来告知该方法的调用者一些必要的信息.
Java 通过面向对象的方法来处理异常. 在一个方法的运行过程中, 如果发生了异常, 则这个方法会产生代表该异常的一个对象, 并把它交给运行时的系统, 运行时系统寻找相应的代码来处理这一异常. 我们把生成异常对象, 并把它提交给运行时系统的过程称为拋出 (throw) 异常. 运行时系统在方法的调用栈中查找, 直到找到能够处理该类型异常的对象, 这一个过程称为捕获 (catch) 异常.
异常类型
在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类, 即 Throwable 位于异常类层次结构的顶层. Throwable 类下有两个异常分支 Exception 和 Error
Throwable 类是所有异常和错误的超类, 下面有 Error 和 Exception 两个子类分别表示错误和异常. 其中异常类 Exception 又分为运行时异常和非运行时异常, 这两种异常有很大的区别, 也称为不检查异常 (Unchecked Exception) 和检查异常(Checked Exception)
Exception 类用于用户程序可能出现的异常情况, 它也是用来创建自定义异常类型类的类.
Error 定义了在通常环境下不希望被程序捕获的异常. Error 类型的异常用于 Java 运行时由系统显示与运行时系统本身有关的错误. 堆栈溢出是这种错误
运行时异常都是 RuntimeException 类及其子类异常, 如 NullPointerException,IndexOutOfBoundsException 等, 这些异常是不检查异常, 程序中可以选择捕获处理, 也可以不处理. 这些异常一般由程序逻辑错误引起, 程序应该从逻辑角度尽可能避免这类异常的发生
非运行时异常是指 RuntimeException 以外的异常, 类型上都属于 Exception 类及其子类. 从程序语法角度讲是必须进行处理的异常, 如果不处理, 程序就不能编译通过. 如 IOException,ClassNotFoundException 等以及用户自定义的 Exception 异常, 一般情况下不自定义检查异常. 表 1 列出了一些常见的异常类型及它们的作用
常见的异常类型
Exception 异常层次结构的根类
RuntimeException 运行时异常, 多数 java.lang 异常的根类
ArithmeticException 算术谱误异常, 如以零做除数
ArraylndexOutOfBoundException 数组大小小于或大于实际的数组大小
NullPointerException 尝试访问 null 对象成员, 空指针异常
ClassNotFoundException 不能加载所需的类
NumberF ormatException 数字转化格式异常, 比如字符串到 float 型数字的转换无效
IOException I/O 异常的根类
F ileN otF oundException 找不到文件
EOFException 文件结束
InterruptedException 线程中断
IllegalArgumentException 方法接收到非法参数
ClassCastException 类型转换异常
SQLException 操作数据库异常
异常处理
异常处理通过 5 个关键字来实现: try,catch,throw,throws 和 finally.try catch 语句用于捕获并处理异常, finally 语句用于在任何情况下 (除特殊情况外) 都必须执行的代码, throw 语句用于拋出异常, throws 语句用于声明可能会出现的异常. 在方法中用 try catch 语句捕获并处理异常, catch 语句可以有多个, 用来匹配多个异常.
对于处理不了的异常或者要转型的异常, 在方法的声明处通过 throws 语句拋出异常, 即由上层的调用方法来处理
- try{
- // 逻辑程序块
- }
- catch(ExceptionType1 e){
- // 处理代码块 1
- }
- catch (ExceptionType2 e){
- // 处理代码块 2
- throw(e); // 再抛出这个 "异常"
- }
- finally{
- // 释放资源代码块
- }
自定义异常
如果 Java 提供的内置异常类型不能满足程序设计的需求, 可以设计自己的异常类型. 自定义异常类必须继承现有的 Exception 类或 Exception 的子类来创建, 其语法形式为
<class><自定义异常名><extends><Exception>
自定义异常类一般包含两个构造方法: 一个是无参的默认构造方法, 另一个构造方法以字符串的形式接收一个定制的异常消息, 并将该消息传递给超类的构造方法.
- public class MyException extends Exception
- {
- public MyException()
- {
- super();
- }
- public MyException(String str)
- {
- super(str);
- }
- }
- // 使用
- throw new MyException("异常信息!");
来源: https://www.cnblogs.com/lilinfeng/p/10995746.html