java异常学习笔记

一.java异常简介

1.异常:程序在运行过程中发生由于外部问题(如硬件错误、输入错误)等导致的程序异常事件。(在Java等面向对象的编程语言中)异常本身是一个对象。
2.三种类型的异常:

(1)检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。

(2)运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。

(3)错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

3.异常方法

(1)public String getMessage():返回关于发生的异常的详细信息。

(2)public Throwable getCause():返回一个Throwable 对象代表异常原因。

(3)public String toString():使用getMessage()的结果返回类的串级名字。

(4)public void printStackTrace():打印toString()结果和栈层次到System.err,即错误输出流。

(5)public StackTraceElement [] getStackTrace():返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

(6)public Throwable fillInStackTrace():用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中

二、异常的使用及注意点

1、异常的处理方案

try...catch、try...catch...finally、try...finally
    try{
        可能会发生异常的代码块
    }catch(异常类型 异常名(变量)){
        针对异常进行处理的代码
    }catch(异常类型 异常名(变量)){
        针对异常进行处理的代码
    }finally{
        一定会执行的代码
    }

2.在catch捕获异常时,为什么不考虑使用Throwable类型,而只是使用Exception来进行接收?

Throwable表示的范围要比Exception大。实际上程序使用Throwable来进行处理,没有任何语法问题,但是却会存在逻辑问题。因为此时出现的(或者说用户能够处理的)只有Exception类型,而如果使用Throwable接收,还会表示可以处理Error的错误,而用户是处理不了Error错误的,所以在开发中用户可以处理的异常都要求以Exception类为主。

3.检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)区别?

(1)所有的检查性异常都继承自java.lang.Exception;所有的非检查性异常都继承自java.lang.RuntimeException。

(2)检查性异常和非检查性异常最主要的区别在于其处理异常的方式:检查性异常必须使用try catch或者throws等关键字进行处理,否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。

(3)常见的运行时异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;

(4)常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、SQL语句异常(SQLException)等。

三.自定义异常

自定义的异常应该总是包含如下的构造函数:

(1)一个无参构造函数

(2)一个带有String参数的构造函数,并传递给父类的构造函数。

(3)一个带有String参数和Throwable参数,并都传递给父类构造函数

(4)一个带有Throwable 参数的构造函数,并传递给父类的构造函数。

参考博客:https://blog.csdn.net/sugar_no1/article/details/88593255