运行时异常和编译异常

article/2025/10/1 12:23:28

1.概念:

Java中将程序执行中发生的不正常情况称为异常(Exception)


2.分类

  • Error(错误):JVM无法解决的严重问题,程序会崩溃,比如JVM系统内部错误、资源耗尽等
  • Exception:因编程错误等外在因素导致的一般性问题,可以使用针对性代码进行处理,如空指针访问、网络连接中断等,Exception可以分为两大类:
    • 运行时异常:编译器检测不出,是java.lang.RuntimeException类及其子类,一般是指编程时的逻辑错误,可以不作处理(不做处理不是说不会报错),若全部处理可能会影响代码的可读性和运行效率
    • 编译时异常:编译器要求必须处置的异常,否则代码不能通过编译
  • 异常体系图:

在这里插入图片描述


3.常见运行时异常

  • NullPointerException:空指针异常,当应用程序试图在需要对象的地方出现null时抛出该异常
  • ArithmeticException: 数学运算异常,当出现异常的运算条件时抛出此异常
  • ArrayIndexOutOfBoundsException: 数组下标越界异常,用非法索引访问数组时抛出的异常
  • ClassCastException :类型转换异常,当试图将对象强制转换为不是实例的子类时抛出该异常
  • NumberFormatException:数字格式不正确异常,当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时抛出该异常

4.常见编译异常

  • SQLException:操作数据库时查询表可能发生的异常

  • IOException:操作文件时发生的异常

  • FileNotFoundException:操作不存在文件时发生的异常

  • ClassNotFoundException:加载类而类不存在时发生的异常

  • EOFException:操作文件到文件末尾发生异常

  • IllegalArguementException:参数异常


5.异常处理

  • 概念:当异常发生时对异常处理的方式

  • 处理方式:

    • try-catch-finally:程序员在代码中捕获发生的异常并自行处理

      try {// 可能有异常的代码
      }catch (Exception e){// 1.异常发生时将异常封装为Exception e传递给catch// 2.得到该对象后程序员自己处理// 3.如果没有发生异常catch代码块不执行
      }finally {// 不管try代码块是否发生异常都要执行finall代码块// 一般用于释放资源// 可以只有try-catch部分
      }
      • 异常发生后,异常部分后面的代码不会执行(不是必须将try代码块全部执行,而是try代码块中发生异常后面的代码不会执行)而是直接进入到catch代码块,注意try-catch代码块后面的代码还是会执行(除非未正确捕获或者在catch代码块中return了):
      try {String str = "psj";int a = Integer.parseInt(str);System.out.println(a);  // 该行代码不会执行
      } catch (NumberFormatException e) {e.printStackTrace();
      }
      System.out.println("程序继续...");  // 这一行代码还是会执行
      
      • 可以有多个catch语句,但是父类异常在后,子类异常在前。如果发生异常只会匹配一个catch:
      try {String str = "psj";int a = Integer.parseInt(str);System.out.println(a);
      } catch (NumberFormatException e) {e.printStackTrace(); // 执行该代码块
      } catch (Exception e) {e.printStackTrace();  // 不会再去执行该代码块
      }
      
      • try-finally配合使用相当于没有捕获异常,所以如果出现异常会抛出异常,并没有自己处理,然后执行finally代码块

    • throws:如果方法可能发生某种异常但是无法确定如何处理该异常,可以将发生的异常抛出并交给方法的调用者处理,最顶级的处理者为JVM:

      public static void test() throws FileNotFoundException {FileInputStream f = new FileInputStream("psj.txt");
      }
      
      • throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
      • throws后面可以是一个异常列表
      • try-catch-finallythrows二选一
      • 程序员没有显示处理异常,默认使用throws抛出异常

    在这里插入图片描述

  • 注意事项:

    • 编译异常必须处理,即显示使用throwstry-catch

    • 对于运行时异常,如果程序没有处理默认是throws方式处理

    • 子类重写父类方法时,抛出的异常类型要么和父类抛出的一致,要么为父类抛出异常类型的子类

  • 自定义异常:程序中的错误信息没有出现在Throwable子类中描述处理,此时需要自己设计异常类用于描述该错误信息

    • 定义类:异常类继承ExceptionRuntimeException(继承Exception属于编译异常,继承RuntimeException属于运行异常),一般继承RuntimeException(因为编译异常必须要处理)
    int age = 180;
    //要求范围在 18 – 120 之间,否则抛出一个自定义异常
    if(!(age >= 18 && age <= 120)) {//通过构造器设置信息throw new AgeException("年龄需要在 18~120 之间");
    }
    System.out.println("你的年龄范围正确.");
    //-----------自定义异常类------------
    class AgeException extends RuntimeException{public AgeException(String message) {System.out.println(message);}
    }
    
  • throw和throws的区别:

意义位置后面跟的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象
try {if (args.length != 4){// 该行代码生成一个异常,因为try代码块中出现异常,所以又去执行catch代码块throw new ArrayIndexOutOfBoundsException("参数个数不对");   }
} catch (ArrayIndexOutOfBoundsException e) {System.out.println(e.getMessage());
}

tips:

  • 为什么try-catch-finally外的代码还可以执行?因为使用异常捕获的目的就是为了让程序继续正常执行(但是出现异常时try中的代码不能再继续往下执行)

  • 既然try-catch外的代码块在出现异常后依旧可以执行,为什么还需要finally代码块?因为catch并不能保证一定能捕获到正确的异常,会导致后续代码无法执行:

try {String str = "psj";int a = Integer.parseInt(str);System.out.println(a);
} catch (ArrayIndexOutOfBoundsException e) {  // 异常捕获错误,这里是类型转换异常却捕获的是数组越界e.printStackTrace();
}
System.out.println("程序继续...");
  • try/catch代码块中如果有return语句,还是会去执行finally代码块,如果finally中有return语句就执行finally的return语句,没有就执行try/catch代码块中的return语句(假设try-catch-finally中try-catch中都有return语句,不出现异常时执行try中的,出现异常就执行catch中的)
System.out.println("执行test方法后,i=" + test());
//--------------test方法--------------
public static int test() {int i = 0;try {String str = "psj";int a = Integer.parseInt(str);return i;} catch (NumberFormatException e) {return ++i;  // 执行++i后i=1,但是不会执行return,而是必须执行finally代码块} finally {++i;  // 这个i是上面++i后的i值,所以该步++i后变为2System.out.println("执行finally代码块后,i=" + i);return 3}
}
// 最后结果:
执行finally代码块后,i=2
执行test方法后,i=3
  • 由于声明代码块中的变量为局部变量,所以声明在try中的变量不能在catch和finally中使用,反之亦然(比如在JDBC中会把需要关闭的对象在try-catch-finally代码块外先声明并赋值null)
  • finally代码块中有return语句了就不能再在try-catch-finally外加上return语句,因为finally代码块中的return语句是必须执行的。如果有try-catch中都有return语句,此时也不能在try-catch-finally外加上return语句


http://chatgpt.dhexx.cn/article/ukUplpAi.shtml

相关文章

Java Exception

Java Exception ####分类 Types of Exception There are mainly two types of exceptions: checked and unchecked where error is considered as unchecked exception. The sun microsystem says there are three types of exceptions: Checked Exception Unchecked Exce…

Java运行时异常和非运行时异常

1.Java异常机制 Java把异常当做对象来处理&#xff0c;并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类&#xff1a;错误Error和异常Exception&#xff0c;Java异常体系结构如下图所示&#xff1a; 图片来源&#xff1a;http://blog.csdn.net/w…

jdk和jre的区别还有maven

1.关于JDK的安装和配置问题 jdk我已经安装了(版本是1.8._60的--->并且完成相关的环境的配置) 还有环境的变量都配置好了的(java_home path 都配置好了的) JDK与JRE的区别 JRE&#xff1a; Java Runtime Environment JRE可以支撑Java程序的运行&#xff0c;包括JVM虚拟机&…

jdk与jre的区别,作用详解!

jdk与jre是Java开发和运行工具&#xff01; jdk包含有jre&#xff0c;但是jre也可以单独安装 下图为jdk目录下的jre 在安装jdk分为两个步骤&#xff0c;我们是经常会将jdk与jre一起安装&#xff0c;如果混淆两个概念建议分开安装。 JRE是Java Runtime Environment的缩写&…

java jdk jre版本要一样吗a_JDK是什么?JRE是什么?JDK和JRE的区别?

原标题:JDK是什么?JRE是什么?JDK和JRE的区别? Java Runtime Environment (JRE) 包含: Java虚拟机、库函数、运行Java应用程序和Applet所必须文件 Java 2 SDK (Development Kit)包含: JRE的超集,包含编译器和调试器等用于程序开发的文件 Java运行环境的三项主要功能: n …

java面试必问:JDK和JRE的区别是什么?

前言 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一…

JDK和JRE的区别是什么?他们都有什么作用

相信很多java的初学者都卡在了JDK和JRE这儿&#xff0c;两者到底什么区别&#xff0c; 多数都是云里雾里的。其实笔者想说的是JDK 和JRE并没有想象中那么简单。 先给大家简单地介绍下Java的各种集成开发工具&#xff1a; JDK:开发工具包 JRE:&#xff08;运行环境&#xff0…

Java之jdk与jre的区别

很多程序员已经干了一段时间java了依然不明白jdk与jre的区别。 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK&#xff0c;它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包&#xff0c;可以包括函数库、编译程序等。 …

[JAVA学习] JDK与JRE的区别

最近在学习Python&#xff0c;安装Python IDE ——PyCharm&#xff0c;提示未安装Jave Run Time&#xff0c;于是到Oracle官网下载Jave安装包&#xff0c;发现有JDK和JRE两个版本。 JRE是Java Runtime Environment的缩写&#xff0c;顾名思义是java运行时环境&#xff0c;包含…

JDK、JRE的区别?以及相关面试题

1.JDK和JRE是java面试的基本问题。 下图是它们的直观区别&#xff0c;可从它们的面向对象、主要作用和组成部分三方面对比。其详细如下图所示&#xff1a; 2.JDK就是Java Development Kit 的英文缩写。 1). 主要面向开发人员。开发人员在软件开发时使用的SDK&#xff08;Soft…

eclipse配置jdk,jdk与jre的区别

由于某些原因&#xff0c;需要重新安装eclipse&#xff0c;当然jdk和tomcat也要重新配置&#xff0c;于是发现eclipse居然自带一个jre 了解jre和jdk 那jdk是干啥的呢我看我安装的jdk文件夹里有两个文件夹呵呵呵呵。 搜了一下原来&#xff1a;JRE(Java Runtime Enviroment)是Jav…

JDK和JRE的区别和联系

大家应该都知道JDK和JRE是什么的缩写&#xff0c;但是当面试官问道 “请用你所学的java知识&#xff0c;告诉我JDK是干什么的&#xff1f;” &#xff0c; “JRE有什么作用&#xff1f;” &#xff0c; “这两者有什么区别和联系&#xff1f;” 等问题时&#xff0c;可能就说的…

JDK和JRE的区别

JDK是 Java 语言的软件开发工具包(SDK)&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具&#xff08;在JDK的安装目录下有一个jre目录&#xff0c;里…

Java一步到位!彻底了解JDK、JRE、JVM分别是什么及它们之间的联系

大多数人刚接触Java的时候都会经常看到JDK、JRE、JVM&#xff0c;但可能一直迷迷糊糊&#xff0c;不知道它们之间真正的作用和含义&#xff0c;而了解JDK、JRE、JVM分别是什么及它们之间的关系有助于我们更加深刻的理解java语言的特性。 Java程序是运行在JVM(Java虚拟机)上的&…

JDK 和 JRE 有什么区别?

面向人群不同&#xff1a; JDK是面向开发人员使用的SDK。 JRE是Java Runtime Enviroment是指Java的运行环境&#xff0c;是面向Java程序的使用者。 重要程度不同&#xff1a; JRE的地位就象一台PC机一样&#xff0c;编写的Java程序必须要JRE才能运行。只要你的电脑安装了JRE&am…

JDK和JRE有什么区别?

1. JDK 1). JDK是Java Development Kit的缩写&#xff0c;是Java的开发工具包&#xff0c;主要面向开发人员。 2). JDK包含了JRE&#xff0c;同时还包含了编译java源码的编译器javac&#xff0c;还包含了很多java程序调试和分析的工具&#xff1a;jconsole&#xff0c;jvisual…

进程虚拟地址

在前面的章节中&#xff0c;我们主要关注的是内核的虚拟地址空间的管理。从本节开始&#xff0c;我们重点关注管理用户空间的方法&#xff0c;其中由于种种原因&#xff0c;这个比内核地址空间管理更复杂。本节主要围绕以下内容&#xff1a; 用户进程的虚拟地址空间是Linux的一…

【此后无良辰】 实验3 进程的创建

实验目的 了解操作系统中内核程序和应用程序之间的关系&#xff1b;了解操作系统创建进程的过程&#xff1b;掌握在应用程序中创建进程的方法。 实验内容与记录 3.1 复制SDK文件夹的目的是什么&#xff1f;尝试在复制后把本地所生成的EOS内核项目文件夹删除&#xff0c;应用…

Linux进程管理(二)进程调度

Linux进程管理 Linux进程管理&#xff08;一&#xff09;进程数据结构 Linux进程管理&#xff08;二&#xff09;进程调度 Linux进程管理&#xff08;三&#xff09;进程调度之主动调度 Linux进程管理&#xff08;四&#xff09;进程调度之抢占式调度 Linux进程管理&#…

c语言静态结构体指针变量,C语言 结构体和指针详解及简单示例

指针也可以指向一个结构体&#xff0c;定义的形式一般为&#xff1a; struct 结构体名 *变量名; 下面是一个定义结构体指针的实例&#xff1a; struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1 { "T…