• 相较于其他语言的优势,Java的异常机制帮助程序员排查错误
  • 可通过JDK API 1.6.0 中文版.chm查询相关信息。

一、常见异常

image.pngHG0U4H_V}`L03RHA$92]HV4.png

1.1 不可处理异常:Error

对应的是Jvm虚拟机的内部的一些错误,如堆内存溢出,栈内存溢出。
jvm系统内部错误,资源耗尽等严重错误,不可处理

1.2 可处理异常:Exception类

编译时异常会直接或间接的继承Exception类,运行时异常会继承RuntimeException

1.2.1 运行时异常
  • 直接或间接继承了RuntimeExcption:
  • 程序在编译时不会发生任何报错,程序员可处理可不处理,但是不处理可能导致程序不能继续向下执行。

    • 空指针异常NullPointException 经常遇见的异常接收过来的引用为
    • 空某参数为空(编译时正常运行时报错)解决方法:对接受过来的引用数据进行非空校验;特别对于web

    • 数组索引越界异常:ArrayIndexOutfBoundException

    • 类文件未找到异常:

造型异常/类型转换异常:ClassCastException

1.2.2 编译时异常

直接或者间接继承了Exception

(发生概率较大的异常会定义为编译时异常)一定会报错,要求编程人员一定要进行处理。

  • 文件找不到异常:FileNotFoundException
  • IOException

二、异常处理机制

找异常提示:异常抛出,最上面一行的异常位置最精确;

2.1 throw方式

  1. throws写在方法名后向调用者抛出;throw是在方法内抛出异常对象;

    做判断,抛出异常:throw new 异常名(“提示”)

    throws FileNotFoundException 编译时异常,必须处理;

throws NullpointerException 运行时异常;可以不管;

  1. 异常处理机制的抛出流程: 通过throws把异常向上抛,通常跟值在方法参数定义后,对整个方法代码进行检测最后抛到主函数再从主函数抛到 jvm虚拟机

  2. 异常Exception: 因为编程错误或者偶然的外在因素导致的一般性错误;可处理

2.2 异常处理机制try-catch - finally

  1. try{
  2. 具体要被检测的代码部分
  3. } catch(异常类 异常类的引用){
  4. 针对该异常的处理;(异常一旦出现一定会进入catch语句块)
  5. }catch( ){
  6. }finally{
  7. 该语句必回执行,用于资源回收(一般是指系统资源浪费)}
  1. catch(异常类 异常类的引用)中可以使用最大的父类Exception异常类来接收;

通过这种方式去处理异常,在捕获异常后,还是会创建该异常对象,但是该异常对象会被catch语句所捕获,具体用异常类来接收该异常对象。

  1. fianlly 做非空校验iffileinputexception != 0
  2. //看是否创建了流文件对象;
  3. try{异常对象名. close()}.
  4. //关闭资源的方法;
  5. exception.printStackTrace();//打印日志信息 ;
  6. //强行结束jvm才能让fianlly不执行。
  1. 抛出的异常必须是异常能够接受的异常(同类或者父类)

    最大父类来接收异常,接收好但是不好处理;
    最好精确一点,针对不同异常进行处理;

三、自定义异常:

  1. Java提供了很多异常,但是这些在项目中并不够用,需要自定义异常;
  2. 自定义异常流程:
  • 直接声明一个类,
  • 如果想定义一个编译时异常让其继承exception

    1. 如果想定义运行时异常让该类去继承runtimeexception,<br /> 如果需要构造,通过super把当前类传给父类即可;
    1. public Exception(异常信息String message){
    2. super(message)}
    3. 通过throw +异常对象;
  1. 案例:

    需求:自定义一个异常,年龄不能为负数否则抛出异常,AgeException

    1. 创建一个用户类User nameage

    给age赋值时,如果年龄要是小于0的话,就抛出该异常。