首页 > 编程语言 >Java异常

Java异常

时间:2024-09-04 08:52:25浏览次数:6  
标签:Exception Java 抛出 Throwable new 异常 out

异常类型

Throwable 类

Java 程序中的异常是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。

java 程序中所有的异常都继承自 Throwable 类,Throwable 类有两个子类 Error 类和 Exception 类:

  • Error 类:【错误】表示 java 程序在运行时产生的无法处理的故障(如堆栈溢出),错误出现时会导致程序无法正常执行并强制退出。

  • Exception 类:【异常】表示 java 程序中产生的可以被处理的故障,异常出现时可以由程序进行处理。

Throwable

RuntimeException 类

【运行时异常】 Exception 类的子类。

表示 java 程序运行状态中发生的异常,在编译时无法被检测。在 java 程序运行时会由系统自动抛出,允许应用程序不进行处理。

异常类型介绍
ArithmeticException算术异常,以零做除数
ArrayIndexOutOfBoundException数组越界异常
NullPointerException空指针异常,对象不存在

Checked Exception 类

【可检查异常】Exception 类除 RuntimeException 以外其他子类的统称。

表示 java 程序编译时检测到的异常。出现时必须在程序中进行捕获或抛出,否则编译不会通过。

异常类型介绍
IOExceptionIO 异常
FileNotFoundException找不到文件异常,继承自 IO 异常
ClassNotFoundException找不到类异常

Exception 类

源码解析

状态信息

Throwable / Exception 类是有状态的(因此 Throwable 是接口而不能是类),记录了四个信息:
 

private transient Object backtrace;                          // 栈的回溯点
private String detailMessage;                                // 异常的信息:在创建异常时备注
private Throwable cause = this;                              // 异常的原因:导致该异常的异常,默认为自身
private StackTraceElement[] stackTrace = UNASSIGNED_STACK;   // 异常的发生顺序:以栈的形式存储

构造方法

Throwable / Exception 类含有四个构造方法,在创建时可以记录异常信息:

throw new Exception();                           // 默认
throw new Exception("message");                  // 记录异常信息
throw new Exception(e);                          // 记录异常原因
throw new Exception("message", e);               // 记录详细信息和异常原因

常用方法

Throwable / Exception 类定义了多种常用方法用于获取异常数据,常用的有:

  • getMessage 方法:获取异常的信息。
  • getStackTrace 方法:获取的异常发生顺序。
  • printStackTrace 方法:获取异常的发生顺序并打印(开发和调试阶段用来显示异常信息,帮助开发者找出错误)。
catch(Exception e){
    System.out.println(e.getMessage());
    e.printStacTrace();                           
}

自定义异常

我们也可以通过继承并重写 Exception / RuntimeException 类的方式,自定义异常类并使用。

// 自定义异常,重写方法可任选
class MyException extends Exception {
    @Override
    public MyException() {
        super();
    }
    @Override
    public MyException(String message) {
        super(message);
    } 
    @Override
    public MyException(String message, Throwable cause){
        super(message,cause);
    }
    @Override
    public MyException(Throwable cause) {
        super(cause);
    }
}

 

异常转译

在项目开发过程中,当 Sevice/DAO 层出现如 SQLException 异常时,程序一般不会把底层的异常传到 controller 层。程序可以捕获原始异常,然后再抛出一个新的业务异常。
 

catch(SQLException e){
    throw new MyException("SQL Error", e);
}

异常处理

抛出异常 throw

当方法执行出现问题时,方法就会创建异常对象并抛出。开发者可以在程序中自行抛出异常;JVM 在执行程序时发现问题也会自动抛出异常。

  • throw 语句:开发者自行创建异常对象并抛出,等待程序进行异常处理。

  • throws 语句:声明方法可能抛出某种异常且未经处理,调用该方法的上级需要进行异常处理。


class TestException{       
    // 把方法中的抛出异常交给上层处理     
    public void writeList(int size) throws IndexOutOfBoundsException, IOException{
        PrintWriter out = null;
        // 用户自定义异常并抛出
        if(size < 1) throw new IndexOutOfBoundsException("至少要输出1个字符");
        try{
            // 虚拟机自动发现异常也会抛出,必须出现在 try 代码块中
            out = new PrintWriter(new FileWriter(txt));
            for (int i = 0; i < size; i++)
                System.out.println("Value at: " + i + " = " + list.get(i));
        }finally{
            if (out != null) out.close();
        }
     }
}

 

捕获异常 catch

当方法执行抛出异常时,必须由专门的代码块对异常进行处理。

  • try 语句:可能出现异常的代码块。

  • catch 语句:捕获相应异常后停止执行 try 代码,转而执行对应 catch 代码。如果没有异常 catch 代码不会执行。

  • finally 语句:无论是否发生异常,finally 代码总会被执行。一般用于释放资源。

注意事项

  1. 如果 try 语句中出现的异常未被 catch,默认将异常 throw 给上层调用者处理。但必须在方法中声明 throws。

  2. try/catch 代码中的 return 语句会在执行完 finally 后再返回,但 finally 中对返回变量的改变不会影响最终的返回结果。

  3. finally 代码中应避免含有 return 语句或抛出异常,否则只会执行 finally 中的 return 语句,且不会向上级抛出异常。

Java 7 后在 try 语句中打开 IO 流,会在跳出后自动关闭流。不必再用 finally 语句关闭。

class TestException{               
    public void writeList(int size) {
        PrintWriter out = null;
        try {
            if(size < 1) throw new IndexOutOfBoundsException("至少要输出1个字符");
            out = new PrintWriter(new FileWriter("OutFile.txt"));
            for (int i = 0; i < size; i++)
                System.out.println("Value at: " + i + " = " + list.get(i));
        } catch (IndexOutOfBoundsException e) {
            System.err.println("Caught IndexOutOfBoundsException: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("Caught IOException: " + e.getMessage());
        } finally {
            if (out != null) out.close();
        }
    }
}

标签:Exception,Java,抛出,Throwable,new,异常,out
From: https://blog.csdn.net/2401_84881237/article/details/141883395

相关文章

  • 使用Java进行中小学违规教育培训数据采集实践-以某城市为例
    目录前言一、违规教育信息1、内容管理 2、转换后的内容二、数据库设计1、空间数据库三、字符地址位置转换空间信息1、实现时序图2、后台实体类的设计与实现3、数据持久化操作 四、总结前言        时间来到2024年8月24日,时间过得很快,2024年的暑假即将结束。神兽们该归笼......
  • Java 代码重构:提升代码质量和可维护性
    Java代码重构:提升代码质量和可维护性大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、代码重构的重要性在软件开发过程中,代码重构是一项至关重要的活动。它不仅仅是为了优化现有代码,更是为了提高代码的可读性、可维护性和扩展性。良好的重构可以减少......
  • Java 日志系统:记录、监控与问题排查
    Java日志系统:记录、监控与问题排查大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、日志系统的重要性在Java开发中,日志系统是不可或缺的一部分。它帮助开发者记录程序运行时的状态,监控系统行为,并在出现问题时进行快速排查。二、日志级别日志系统通常......
  • Java 单元测试:保障代码质量的关键步骤
    Java单元测试:保障代码质量的关键步骤大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、单元测试的定义和重要性单元测试是针对程序中最小的可测试部分进行的测试。在Java中,这通常意味着对单个方法或类进行测试。单元测试是保障代码质量的关键步骤,它有......
  • Java学习路径
    1.Java基础Java语法:变量、数据类型、控制结构(if、for、while等)面向对象编程:类、对象、继承、多态、接口异常处理:try-catch-finally,创建自定义异常集合框架:List、Set、Map等2.Java高级特性泛型:如何使用和创建泛型类和方法流(Streams)和Lambda表达式:处理集合和数据流多线......
  • Java中的限流策略:防止系统过载
    Java中的限流策略:防止系统过载大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在高并发的系统中,限流是一个非常重要的策略,它可以帮助我们保护系统不被过多的请求压垮,从而保证系统的稳定性和可用性。在Java中,有多种限流策略可以实现,本文将介绍几种常用......
  • Java中的缓存机制:提升应用性能
    Java中的缓存机制:提升应用性能大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!缓存是提高应用程序性能的关键技术之一。通过减少对数据库或远程服务的直接访问,缓存可以显著减少延迟并提高响应速度。在Java中,有多种方式可以实现缓存,包括使用内存缓存、......
  • Java中的分布式锁:确保分布式系统中的数据一致性
    Java中的分布式锁:确保分布式系统中的数据一致性大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,数据一致性是一个非常重要的问题。为了保证数据一致性,我们通常需要使用分布式锁来控制多个节点对共享资源的访问。分布式锁可以确保在任何......
  • Java中的分布式事务处理:解决方案与实践
    Java中的分布式事务处理:解决方案与实践大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,事务处理是一个复杂的问题。传统的单体应用事务管理通常依赖于数据库的事务特性,但在分布式系统中,事务需要跨多个服务和数据库进行管理。Java提供了......
  • Java应用的多租户架构设计
    Java应用的多租户架构设计大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!多租户架构(Multi-Tenancy)是SaaS(SoftwareasaService)应用中常见的设计模式,它允许多个租户(客户)共享同一个应用实例,同时保证数据隔离和独立性。在Java应用中实现多租户架构,涉及......