首页 > 编程语言 >java基础3

java基础3

时间:2024-12-26 09:21:03浏览次数:6  
标签:Java 基础 try catch finally 泛型 java 序列化

JavaGuide官方知识星球

异常

Java 异常类层次结构图概览

Java 异常类层次结构图

Exception 和 Error 有什么区别?

在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类:

  • Exception :程序本身可以处理的异常,可以通过 catch 来进行捕获。Exception 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。
  • ErrorError 属于程序无法处理的错误 ,我们没办法通过 catch 来进行捕获不建议通过catch捕获 。例如 Java 虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefFoundError)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。

Checked Exception 和 Unchecked Exception 有什么区别?

Checked Exception 即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被 catch或者throws 关键字处理的话,就没办法通过编译。

比如下面这段 IO 操作的代码:

除了RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常 。常见的受检查异常有:IO 相关的异常、ClassNotFoundExceptionSQLException...。

Unchecked Exception不受检查异常 ,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。

RuntimeException 及其子类都统称为非受检查异常,常见的有(建议记下来,日常开发中会经常用到):

  • NullPointerException(空指针错误)
  • IllegalArgumentException(参数错误比如方法入参类型错误)
  • NumberFormatException(字符串转换为数字格式错误,IllegalArgumentException的子类)
  • ArrayIndexOutOfBoundsException(数组越界错误)
  • ClassCastException(类型转换错误)
  • ArithmeticException(算术错误)
  • SecurityException (安全错误比如权限不够)
  • UnsupportedOperationException(不支持的操作错误比如重复创建同一用户)
  • ……

Throwable 类常用方法有哪些?

  • String getMessage(): 返回异常发生时的详细信息
  • String toString(): 返回异常发生时的简要描述
  • String getLocalizedMessage(): 返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同
  • void printStackTrace(): 在控制台上打印 Throwable 对象封装的异常信息

try-catch-finally 如何使用?

  • try块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
  • catch块:用于处理 try 捕获到的异常。
  • finally 块:无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。

代码示例:

try {
    System.out.println("Try to do something");
    throw new RuntimeException("RuntimeException");
} catch (Exception e) {
    System.out.println("Catch Exception -> " + e.getMessage());
} finally {
    System.out.println("Finally");
}

输出:

Try to do something
Catch Exception -> RuntimeException
Finally

注意:不要在 finally 语句块中使用 return! 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。

jvm 官方文档中有明确提到:

If the try clause executes a return, the compiled code does the following:

  1. Saves the return value (if any) in a local variable.
  2. Executes a jsr to the code for the finally clause.
  3. Upon return from the finally clause, returns the value saved in the local variable.

代码示例:

public static void main(String[] args) {
    System.out.println(f(2));
}

public static int f(int value) {
    try {
        return value * value;
    } finally {
        if (value == 2) {
            return 0;
        }
    }
}

输出:

finally 中的代码一定会执行吗?

不一定的!在某些情况下,finally 中的代码不会被执行。

就比如说 finally 之前虚拟机被终止运行的话,finally 中的代码就不会被执行。

try {
    System.out.println("Try to do something");
    throw new RuntimeException("RuntimeException");
} catch (Exception e) {
    System.out.println("Catch Exception -> " + e.getMessage());
    // 终止当前正在运行的Java虚拟机
    System.exit(1);
} finally {
    System.out.println("Finally");
}

输出:

Try to do something
Catch Exception -> RuntimeException

另外,在以下 2 种特殊情况下,finally 块的代码也不会被执行:

  1. 程序所在的线程死亡。
  2. 关闭 CPU。

相关 issue:https://github.com/Snailclimb/JavaGuide/issues/190

标签:Java,基础,try,catch,finally,泛型,java,序列化
From: https://www.cnblogs.com/firsthelloworld/p/18631834

相关文章

  • JVM实战—1.Java代码的运行原理
    大纲1.Java代码到底是如何运行起来的2.JVM类加载机制的一系列概念3.JVM中有哪些内存区域及各自的作用4.JVM的垃圾回收机制的作用5.问题汇总1.Java代码到底是如何运行起来的(1)首先假设写好了一个Java系统(2)把.java代码文件编译成.class字节码文件(3)启动JVM进程运行......
  • JVM实战—1.Java代码的运行原理
    大纲1.Java代码到底是如何运行起来的2.JVM类加载机制的一系列概念3.JVM中有哪些内存区域及各自的作用4.JVM的垃圾回收机制的作用5.问题汇总 1.Java代码到底是如何运行起来的(1)首先假设写好了一个Java系统(2)把.java代码文件编译成.class字节码文件(3)启动JVM进程运行.......
  • 基于Java+SpringBoot的预报名管理系统
    关注底部领取源码源码编号:S399源码名称:基于SpringBoot的预报名管理系统用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:14张表是否有毕业论......
  • 基于Java+SpringBoot的面向智慧教育的实习实践系统
    关注底部领取源码源码编号:S401源码名称:基于SpringBoot的面向智慧教育的实习实践系统用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:13张表......
  • Java多线程第三篇-多线程的代码相关案例
    文章目录一.单例模式1.1饿汉模式1.2懒汉模式1.3指令重排序1.4解决方法volatile二.阻塞队列2.1模拟实现阻塞队列(生产者消费者模型)三.定时器(日常开发常见的组建)3.1创建并模拟定时器实现四.线程池4.1线程池的构造方法的使用4.2模拟实现线程池五.锁策略(特点)5.......
  • 南昌航空大学-软件学院-22207112-卢翔-JAVAPTA(7-8)博客
    目录前言PTA第七次作业设计与分析题目分析知识点解析调试过程改进建议PTA第八次作业设计与分析题目分析知识点解析调试过程改进建议踩坑心得总结学期总结前言PTA第七次作业设计与分析题目分析本题在家居强电电路模拟程序-2基础上新增了多个并联电路串联在一起的情况。需要虑......
  • AE2024零基础入门
    【AE教程】从零开始学剪辑(新手入门AE2024实用版)AE2024零基础入门教程!!!https://www.bilibili.com/video/BV1iH4y1E7Vy 3 6【AE2024基础课】课程大钢【AE2024基础课】1.界面布局【AE2024基础课】2.首选项设置【AE2024基础课】3.导入素材【AE2024基础课】4.新建合成·课程知......
  • # 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第14周学习总结
    学期(如2024-2025-1)学号(如:20241402)《计算机基础与程序设计》第14周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写上......
  • 打印三角形金字塔 、debug、java的方法、命令行传参、可变参数20241225
    打印三角形金字塔debug20241225packagecom.pangHuHuStudyJava.struct;publicclassPrint_Tran{publicstaticvoidmain(String[]args){for(intj=0;j<5;j++){for(intr=5;r>j;r--){System.out.print(&#......
  • pygame基础功能总结
    1.导入Pygame模块(1) 模块并初始化① Importpygame② Pygame.init()(2) 创建窗体① Window_size=(800,600) 长宽② Screen=pygame.disply.set_mode(Window_size)③ pygame.disply.set_caption(“MyFirstPygameWindow”) 设置窗体标题(3) 主循环① Ru......