java异常处理

2020/4/21--Java异常处理

  • java的异常处理机制
  • 使用try、catch、finally处理异常
  • 使用throw和throws应发异常
  • getMessage、printStackTrace方法
  • 自定义异常类

异常概述

是java语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时才能被throw语句跑出,才可以是catch子句中的参数类型。两个子类:Error、Exception用于指示发生了异常情况。

这些实例是在异常情况下的上下文中新近创建的,因此包含了堆栈跟踪数据

Error类是指严重的系统错误,一般是与JVM相关的问题,如系统崩溃、虚拟机出错、动态链接失败等,这一类错误无法恢复或不能捕获,程序将终端。

Exception类是指一些可以捕获并恢复异常的情况,如数组下标越界ArrayIndexOutBoundException、数组被除0产生异常ArithmeticException、输入输出异常I/OException

异常分为以下几种:

  1. 非受检异常

    unchecked异常是指编译器不要求强制处理的异常。一般是指编程的逻辑错误。java.lang.RuntimeException类及其子类

    • 错误的类型转换异常:java.lang.ClassCastException
    • 数组下标越界异常:java.lang.ArrayIndexOutOfBoundException
    • 空指针访问异常:java.lang.NullPointerException
    • 除零溢出错误:java.lang.ArithmeticException
  2. 受检异常

    checked异常是指编译器必须处理的异常,程序在运行时由于外界因素造成的一般性异常。

    • s没有找到指定名称的类异常:java.lang.ClassNotFoundException
    • 访问不存在的文件:java.io.FileNotFoundException
    • 操作文件时发生的异常: java.io.IOException
    • 操作数据库发生的异常:java.sql.SQLException

try和catch捕获异常

出现异常时,会自动生成一个异常对象,该异常对象被自动交给JVM,JVM接受到后,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常。找不到捕获异常的方法,系统将终止,程序也退出

异常发生时要执行catch后面括号中的语句,并且catch之后的语句也会整形;没有异常发生,不会执行catch后面括号中的语句。

throw和throws引发异常

  1. throw

    必须throw出一个对象,throw完成后,程序立即停止

    try {
        number = Integer.parseInt(args[0]);
    } catch(Exception e) {
        throw new ArrayIndexOfBoundException("数组越界");
    }
    
  2. throws

    一个方法a可以引发异常,而它自己并不对该异常进行处理,那么a方法必须将这个异常抛给调用以使程序能够继续运行下去。这时候就要用到throws语句。

    try {
        createThrow(tmp);
    } catch(Exception e) {
        System.out.println("来自createThrow方法的异常");
    }
    
    public static void createThrow(String[] tmp) throws Exception {
        int number = 0;
        number = Integer.parseInt(tmp[0]);
        System.out.println("你输入的数字为:"+number);
    }
    
  3. throw、throws语句组合应用

    捕获异常后,跑出一个明确的异常给调用者

    // 调用有异常的方法
    public static void testThrow(String[] tmp) {
        try {
            createThrow(cmp);
        } catch(Exception e) {
            System.out.println("捕获来自createThrow方法的异常");
        }
    }
    
    //抛出一个具体的异常
    public statci void createThrow(String[] tmp) throws Exception {
        int number = 0;
        try {
            number = Integer.parseInt(tem[0]);
        } catch(Exception e) {
            throw new ArrayIndexOfBoundException("数组越界");
        }
        System.out.println("你输入的数字为:" + number);
    }
    

    throw语句写在方法中,throws语句是在方法前面之后的,throws抛出的类型的范围要比throw抛出的对象范围大才可以用。

finally关键字

无论异常总要被执行的代码。

finally语句在return之前执行。

getMessage 和 printStackTrace方法

getMessage用法:ex.getMessage()

printStackTrace用法:ex.printStackTrace();

多重catch

类似switch,挨个去检查与异常类型匹配的catch语句块,执行其中之一后,其他catch语句忽略

Java异常处理的几个原则:

  1. 不要丢弃异常
  2. catch语句应该制定具体的异常类型
  3. finally里面释放资源
  4. 分离各个可能出现异常的语句并分别捕获异常
  5. 对于数据不完整,需要用户做出相应处理,至少提示数据的不完整

自定义异常类

定义一个直接间接继承Throwable类的类。一般选择Exception作为父类。

public class MyException extends Exception {
	public MyException(){ super();}
    public MyException(String msg) {
        super(msg);
    }
    public MyException(String msg, Throwable cause) {
        super(msg, cause);
    }
    public MyException(Throwable cause) {
        super(cause);
    }
    
}

使用:

public String[] createArray(int length) throws MyException {
    if (lenght < 0) {
        throw new MyException("数组长度小于0,不合法");
    }
    return new String[length];
      
}
posted @ 2020-04-21 17:30  DengSchoo  阅读(157)  评论(0编辑  收藏  举报