java -- 异常处理

概念

在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常).

当执行一个程序,如果出现了异常,那么异常之后得代码就不再执行.

异常的分类
1. Error: Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理
2. Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
    空指针访问
    试图读取不存在的文件
    网络连接中断

java.lang.Throwable
    -- Errow
    -- Exception

异常的处理:

1. 遇到错误就终止程序的运行
2. 由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。 

捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。比如:除数为0,数组下标越界.因此又分为两种:

  • 编译时异常 执行javac.exe
  • 运行时异常 执行java.exe

java异常类层次结构

异常分类

常见异常:

  • java.lang.RuntimeException
1. ArrayIndexOutOfBoundsException 数组下标越界
2. ArithmeticException 算术异常 
3. ClassCastException 类型转换异常
4. NullPointerException 空指针异常
  • java.io.IOExeption
1. FileNotFoundException 指定的文件没找到
2. EOFException 文件已结束异常

其他

1. java.lang.ClassNotFoundException 指定的类不存在
2. java.lang.InterruptedException 这个异常一般发生在线程中,当一个正在执行的线程被中断时就会出现这个异常
3. java.lang.illegalargumentexception  方法的参数错误
4. java.lang.illegalaccessexception  没有访问权限
5. NegativeArrayException  数组负下标异常
6. SecturityException  违背安全原则异常
7. NumberFormatException  字符串转换为数字异常
8. SQLException  操作数据库异常
9. java.lang.AbstractMethodError  抽象方法错误。当应用试图调用抽象方法时抛出。 
10. java.lang.ClassFormatError  类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。 
11. java.lang.ArrayStoreException  数组存储异常。当向数组中存放非数组声明类型对象时抛出。 
12. java.lang.EnumConstantNotPresentException  枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。 
13. java.lang.IndexOutOfBoundsException  索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。 
14. java.lang.NegativeArraySizeException  数组大小为负值异常。当使用负数大小值创建数组时抛出该异常。 
15. java.lang.NoSuchFieldException  属性不存在异常。当访问某个类的不存在的属性时抛出该异常。 
16. java.lang.NoSuchMethodException  方法不存在异常。当访问某个类的不存在的方法时抛出该异常。 
17. java.lang.StringIndexOutOfBoundsException  字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。 

Exception的处理

Java提供的异常处理是抓抛模型。

这里写图片描述

抛出异常:

Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。

异常对象的生成方式:

1. 虚拟机自动生成: 程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出

2. 开发人员手动创建: Exception exception = new ClassCastException();——创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样 

抓住异常: 抓住上一步抛出来的异常类对象

异常处理机制:

如果一个方法内抛出异常,该异常对象会被抛给调用者方法来处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。

如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。

开发者通常只能处理Exception,而对Error无能为力。

异常处理的两种方式:

  • try-catch-finally语句


try{
    ......  //可能产生异常的代码
}
catch( ExceptionName1 e ){
    e.printStackTrace(); // 
    ......  //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e ){
.printStackTrace(); 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void......  //当产生ExceptionName2型异常时的处置措施
}  
[ finally{
......   //无论是否发生异常,都无条件执行的语句
        }  ]

这里写图片描述

try-catch-finally异常捕捉的过程:

异常捕获

前面使用的异常都是RuntimeException类或是它的子类,这些类的异常的特点是:

即使没有使用trycatch捕获,Java自己也能捕获,并且编译通过  ( 但运行时会发生异常使得程序运行终止 )。

如果抛出的异常是IOException等类型的非运行时异常,则必须捕获,否则编译错误。也就是说,我们必须处理编译时异常,将异常进行捕捉,转化为运行时异常.

  • 声明抛出异常
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

格式:

    public void readFile(String file)  throws FileNotFoundException {
        ……
        // 读文件的操作可能产生FileNotFoundException类型的异常
        FileInputStream fis = new FileInputStream(file);
         ..……
     }

注意: 重写方法声明抛出异常的原则

重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对methodA()方法的调用-异常的捕获按父类声明的异常处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值