Java异常

1.Java异常事件

Java程序在执行过程中所发生的异常事件可分为两类:

Error: Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError和OOM。一般不编写针对性的代码进行处理。

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:

  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断

2.Java异常体系图【掌握

红色:受检异常(编译时异常);蓝色:非受检异常(运行时异常)

  • 运行时异常

是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。

对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。

  • 编译时异常

是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求java程序必须捕获或声明所有编译时异常。

对于这类异常,如果程序不处理,可能会带来意想不到的结果。

3.常见的Java异常

NullPointerException 空指针异常

  当试图使用null对象的属性或方法时

ArrayIndexOutOfBoundsException 数组下标越界异常

  当试图使用数组的索引超过范围:0——length-1

ClassCastException 类型转换异常

  当试图将不是该类型的实例强转成该类型

ArithmeticException 数学运算异常

  除数为0时

NumberFormatException 数字格式不正确

  当试图将字符串转换成数值时,如果该字符串不是有效的数值格式

4.异常处理的概念

处理程序中发生的不正常现象,称为异常处理,Java提供异常处理的抓抛模型(抓:自己处理,抛:抛出处理),默认处理方式为抛

5.异常处理的分类

方式一:自己处理

try{
    需要检测的代码块
}catch(Exception e){
    // 处理的语句
    e.printStackTrace();    // 方式一:打印错误追踪日志
    System.out.println("没有传入有效的数值"); // 方式二:打印友好提示
    System.out.println("出错了,原因是:" + e.getMessage()); // 方式三:打印错误信息
}    

异常类型可以写具体的也可直接写Exception

【注意】

catch块可以省略

catch块可以有多个,要注意catch块中有父类的异常类型要放在最后

不是try中语句越多越好,try块语句过多会影响效率

尽量使用多个catch块代替多个try catch

try{
    ......    //可能产生异常的代码
}
catch( ExceptionName1 e ){
    ......    //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e ){
......     //当产生ExceptionName2型异常时的处置措施
}  
[ finally{
......     //无论是否发生异常,都无条件执行的语句
}  ]

方式二:抛给他人处理

语法:

修饰符 返回类型 方法名(参数列表) throws 异常类型{

  //容易出现异常的代码
}

【注意】

抛出异常类型应该写方法容易出现的具体的异常类型或者其父类类型

子类方法抛出的异常类型要么与父类相同,要么是父类抛出异常的子类

【执行机制】

将方法中的异常抛给调用方,调用方可以有两种处理异常的方式,如果继续往上抛,则可以一直抛到jvm,则jvm会采用默认的处理方式:打印错误堆栈日志。

 6.自定义异常

 定义步骤:

1、定义类XXException 继承RuntimeException(运行异常)或Exception(编译异常)

2、类体中,设计无参和有参构造器

生成异常对象:

1、手动生成:

throw new 异常类型(参数);  // 针对于任何异常类型

2、系统自动生成的 仅仅针对于系统定义好的异常类型

示例:

/**
 * 此类用于演示自定义异常类
 *
 */
public class TestException7 {
    
    public static void main(String[] args) {
        
        Scanner input  = new Scanner(System.in);
        
        System.out.println("年龄:");
        int age = input.nextInt();
        
        if(age>120 || age<0){
            //生成一个异常对象
            
//            AgeIllegalException ae = new AgeIllegalException("年龄不合法!");
            try {
                throw new RuntimeException("年龄不合法!");
            } catch (Exception e) {
//                e.printStackTrace();
                System.out.println("出错了,信息:"+e.getMessage());
            }
        }
        System.out.println("年龄是:"+age);
    }
}

class AgeIllegalException extends RuntimeException{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public AgeIllegalException(String msg){
        super(msg);
    }
    
    public AgeIllegalException(){
        
    }
}

7.面试题

  • 生成异常的方式和区别

1)系统自动生成

只针对于Throwable和Throwable的子类!

2)手动生成

语法:throw new XXException(参数);

可以针对于自定义类和系统定义的异常类

  • throws和throw的对比
  解释 后面跟的东西 放的位置
throw 手动生成异常对象的方式 异常对象 方法体中
throws 异常处理的第二种方式 异常类型 方法声明处
修饰符 返回类型 方法名(参数列表) throws 异常类型{
  //容易出现异常的代码
}
throw new 异常类型(参数);  // 针对于任何异常类型
原文地址:https://www.cnblogs.com/MWCloud/p/11223286.html