Java异常

Java异常

一、java异常概念和分类

1、Java概念

异常(Exception)就是程序在运行过程中出现的一些错误,我们通过面向对象的思想,把这些错误也用类来描述,那么一旦产生一个错误,即就是创建了某一个错误的对象,这个对象就是我们所说的异常对象。以下是常见的异常:

(1)IndexOutOfBoundsException:

  • ArrayIndexOutOfBoundsException
    数组角标越界异常 角标不在数组范围内
  • StringfIndexOutOfBoundsException
    字符串角标越界异常 角标不在字符串范围内

(2)NullPointerException
    空指针异常 对null调用其成员。
(3)ArithmeticException
    数学运算异常 非法的数学运算。
(4)ClassCastException
    类型转换异常 将类进行错误的强制转换。
(5)NumberFormatException
    数字格式化异常 将数字字符串进行解析。
(6)InputMismatchException
    输入不匹配异常 在输入时输入非法数据。
(7)ParseException
    时间解析异常 非法的时间格式。
(8)StackOverFlowError
    栈内存溢出异常 函数递归。
(9)OutOfMemoryError
    堆内存异常 数组空间开辟过大 程序中对象太多。

异常分类

img

  • Throwable

    是java中所有异常和错误的超类,其两个子类为 Error(错误) 和 Exception(异常)

    • Error: 是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

    • Exception

      是程序本身可以捕获并且可以处理的异常。其中可分为运行时异常(RuntimeException)和非运行时异常,也叫做受检异常

      • 非检查异常:也称为“运行时异常”,此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。编译器不会检查运行时异常,在抛出运行时异常时编译器不会报错,当运行程序的时候才可能抛出该异常。Error及其子类和RuntimeException 及其子类都是非检查异常。
      • 检查异常也称为“编译时异常”,编译器在编译期间检查的那些异常。由于编译器“检查”这些异常以确保它们得到处理,因此称为“检查异常”。如果抛出检查异常,那么编译器会报错,需要开发人员手动处理该异常,要么使用try-catch捕获,要么使用throws语句重新抛出,否则编译不通过。除了RuntimeException之外,所有直接继承 Exception 的异常都是检查异常。

    从程序执行的过程来看编译时异常和运行时异常

    • 编译时异常:程序在编译时发生的异常(javac 源文件名.java)
    • 运行时异常: 程序在运行时发生的异常(java 字节码文件名)

二、java异常的处理

try - catch - finally

将可能出现异常的代码放到try{}中, 运行时, 如果代码发成了异常的话,就会生成一个对应的异常类的对象。这个产生的异常对象会与catch的异常类型相匹配,匹配成功后就被 catch 捕获,然后运行catch{}中的代码, 一般catch中的代码为处理异常的代码, 比如返回异常的信息和返回异常的详细信息等. 一旦异常处理完成,就会跳出当前的try-catch结构。无论有没有发生异常finally中的代码都会最后被执行。catch多个异常类型的时候, 如果有子父类关系,小的范围写上面大的范围写下面。

public static void main(){
    try{//try监控区域
        System.out.println(1/0);
    }catch(ArithmeticException){//catch捕获异常
        System.out.println("程序出现异常,分母不能为0");
    }finally{//处理善后工作
        System.out.println("finally");
    }
}

throws 关键字和 throw 关键字在使用上的几点区别如下

  • throws 用来声明一个方法可能抛出的所有异常信息,throw 则是指拋出的一个具体的异常类型。
  • 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
  • throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
public static void main(){
    test(1,0);
    
    //假设在方法中,处理不了这个异常。方法上抛出异常
    public static void test(int a,int b){ 
    	if(b==0){
            //使用throw 语句用来直接拋出一个异常,后接一个可拋出的异常类对象(主动的抛出异常,一般在方法中)
    		throw new ArithmeticException();
        }
    }
    
    public void readFile() throws IOException {
        //定义方法时声明异常
        FileInputStream file = new FileInputStream("read.txt"); //创建 FileInputStream 实例对象
        int f;
        while ((f = file.read()) != -1) {
            System.out.println((char) f);
            f = file.read();
        }
        file.close();
    }
    //声明异常后需要用try,catch捕获异常
    try {
        t.readFile(); // 调用 readFHe()方法
    } catch (IOException e) {// 捕获异常
        System.out.println(e);
    }
}
posted @   代码大虾  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示