异常概述

异常:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。

异常本质就是java当中对出现的问题进行描述的一种对象体现。

常见的异常:

  1. 除数不能为0异常(ArithmeticException)
  2. 空指针异常(NullPointException)
  3. 数组越界异常(ArrayIndexOutOfBoundsException)
  4. 类型转换异常(ClassCastException)
  5. ParseException
  6. ClassNotfoundException
异常分类
  1. Error:称为错误,由java虚拟机生成并抛出,程序对其不做处理。
  2. Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
  3. RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。
  4. 编译时期异常:不是继承自RuntimeException的Exception的子类都称为编译时期异常。

如下图解

[外链图片转存失败(img-dhZOp7y8-1566040463307)(C:\Users\lee\Desktop\1565926285510.png)]

异常处理
  1. 如果我们不做任何处理,异常将会交由虚拟机来处理;虚拟机的处理方式是:把异常的名称、异常出现的位置、异常原因等信息输出打印在控制台,并同时将程序停止执行。
  2. 我们自己处理异常的方式有两种:
    1)try…catch…finally
    异常处理的格式:
try{
	        //放置程序可能出现问题的代码
         }catch(异常类  异常名){
	       //这里放置异常处理的代码
         } finally{
 	      //释放资源
         }

2)throws抛出异常

格式:

[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{
  	}

注意:

  1. java中的Error我们没有办法处理,我们只需要关心Exception的处理。
  2. 编译时异常:java程序必须处理,否则无法通过编译,程序报错。
  3. 运行时异常:程序可以不处理,但是建议一旦发现就应该和编译时异常一样处理。
Throwable类

Throwable类是java语言中所有错误或异常的超类。

成员方法:

  1. public String getMessage():返回此 throwable 的详细消息字符串
  2. public String toString():获取异常类名和异常信息。
  3. public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
  4. public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
Throws关键字
  1. 概述:在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用者进行处理。
  2. 使用格式:
[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2....]{
  	}

注意:

  1. 如果一个方法声明的是编译时期异常,则在调用这个方法之处必须处置这个异常(谁调用谁处理)。
  2. 重写一个方法时,它所声明的异常范围不能被扩大。
Throws和Throw的区别
  1. throws用在方法声明后面,跟的是异常类名;throw用在方法体内,跟的是异常对象名。
  2. throws可以跟多个异常类名,用逗号隔开;throw只能抛出一个异常对象名。
  3. throws表示抛出异常,由该方法的调用者来处理;throw表示抛出异常,由方法体内的语句处理。
  4. throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
finally关键字
  1. finally修饰的代码块一定会被执行,除非在执行到finally之前程序异常退出或者调用了系统退出的方法。比如:System.exit();
  2. finally用于释放资源,在IO流操作和数据库操作中会见到。

inally修饰的代码块一定会被执行,除非在执行到finally之前程序异常退出或者调用了系统退出的方法。比如:System.exit();
2. finally用于释放资源,在IO流操作和数据库操作中会见到。

(finally相关的面试题:final、finally、finalize三者间的区别)