当前位置: 首页 > news >正文

Java报错输出的信息究竟是什么?

Java报错输出的信息究竟是什么?


本篇会带大家了解一下java运行时报错输出的信息内容,简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容

异常信息

当你的程序运行报错时,你是否会好奇打印出来的那一大坨红色的究竟是什么?

在这里插入图片描述
首先,报错的第一行是异常的主要描述信息,那么剩下的基本都是当前线程的栈帧信息
比如上图对于异常的描述是 Access denied for user 'root'@'localhost' (using password: YES),我们的数据库访问被拒绝了,原因就是我把密码输入错误了
那么异常描述下面的信息就是栈帧信息了
什么是栈帧呢,栈帧中又包含了哪些信息?


虚拟机栈

在我们的Java虚拟机中,有一个组成部分叫做运行时数据区,它是程序执行过程中用于存储数据的内存区域,这个区域用于存储程序运行过程中的各种数据,包括对象实例、类信息、局部变量、方法调用信息等
在运行时数据区中,又有一部分是虚拟机栈,每个线程都有一个独立的虚拟机栈,当方法被调用时,会在栈中创建一个新的栈帧(Stack Frame),当方法执行完毕后,栈帧会被弹出,控制权回到调用方,所以虚拟机栈中进进出出的就是程序中的方法的栈帧

那么虚拟机栈是怎么运行的呢
这里以一段代码的运行为例子:

public class Stark {public static void main(String[] args) {FunctionA();}public static void FunctionA(){System.out.println("运行了A");FunctionB();}public static void FunctionB(){System.out.println("运行了B");}
}

当我们运行这段程序时,第一个执行的是Main方法,在Main方法中又调用执行了A方法,在A方法中又执行了B方法,那么在虚拟机栈中,要执行的方法的栈帧会进入虚拟机栈中,待方法完全执行完毕后,他的栈帧才会被弹出:
在这里插入图片描述
此时,三个方法都还没有完全结束,当B方法被调用,输出"运行了B"后,B方法的栈帧才会弹出虚拟机栈,以此类推:
在这里插入图片描述
这就是虚拟机栈的运行过程,我们也可以在IDEA中使用断点调试查看到线程的虚拟机栈,依然使用上面的代码,在B方法上打断点,点击调试运行:
在这里插入图片描述
在左下角就可以看到目前存在的线程中的栈中有哪些栈帧:
在这里插入图片描述
此时正处于B方法中,也就是上图中A方法刚刚调用的B方法,B方法还未结束时,栈中有三个方法的栈帧信息


文章开头提到,报错时会输出当前线程全部的栈帧信息,我们可以试一下
在上述代码的B方法中添加一句抛出异常的代码:

public class Stark {public static void main(String[] args) {FunctionA();}public static void FunctionA(){System.out.println("运行了A");FunctionB();}public static void FunctionB(){System.out.println("运行了B");throw new RuntimeException("出错");}
}

执行代码,你可以在控制台看到打印出了如下内容:
在这里插入图片描述
在报错信息的第一行显示,我们在线程mian中发生了运行时异常,异常信息:“出错”
接着,很显然下面的部分就是栈帧信息,他的打印顺序就是当前虚拟机栈中的全部栈帧依次打印


什么是栈帧

相信看到这里,你会发出疑问,什么是栈帧呢?虚拟机栈中放入的栈帧到底是个什么东西呢?
栈帧是虚拟机栈的基本存储单元,主要是由三部分组成:

  • 局部变量表:
    用于存放方法的参数和局部变量。这些变量在方法执行过程中会被频繁访问,因此将它们存储在栈帧中可以提高访问速度。局部变量表中的变量在方法调用时初始化,并在方法执行完毕后销毁
  • 操作数栈:
    用于保存计算过程中产生的中间结果和作为计算单元的操作数。操作数栈是一个后进先出(LIFO)的数据结构,与局部变量表一起支持方法的执行。
  • 帧数据:
    主要包含动态链接、方法出口、异常表等信息

局部变量表:

我们编译StarkTest类并查看他的字节码文件:

public class StarkTest {public static void main(String[] args) {int i = 0;int j = i + 1;}
}

打开方法,找到Mian方法下的LocalVariableTable就是局部变量表,表中会把方法中的参数和局部变量存放起来,索引从0开始,由于我们的main方法传入了参数args,那么表中下标为0的槽中放了args,方法中我们又声明了i,和j,那么他们会依次保存到槽中
其实局部变量表就是一个数组,每一个位置被称为一个槽,除了long类型和double类型的变量要占两个槽,其余的都只占一个槽,需要注意的是如果该方法不是静态方法而是示例方法,该方法运行时局部变量表的第一个槽会存放调用该方法的实例对象,也就是this
在这里插入图片描述
局部变量表中存放的变量如果在其生效范围内不会在被使用,那么之后的变量或是参数就可以覆盖他的槽,以此节省空间

操作数栈

他就是一块用来存放运行时中间数据的区域,比如上边代码中int i = 0;int j = i + 1;这两行代码执行的过程,先把0放入操作数栈中,再将操作数栈中的数赋值给变量i,然后把i的值放入操作数栈中,再把1也放入操作数栈中,让操作数栈中的两个数相加,再赋值给变量j:
在这里插入图片描述

帧数据

帧数据中主要是动态链接,方法出口

  • 动态链接:
    用于维护方法调用时的符号引用转化为直接引用的信息。在Java中,每个类都有一个常量池,用于存储符号引用。当方法被调用时,JVM会通过动态链接将符号引用转化为直接引用,以便在方法执行过程中访问其他类或方法。
  • 方法出口:
    记录方法正常退出或异常退出时的处理信息。当方法执行完毕后,JVM会根据方法出口的信息将控制权返回给调用者。如果方法在执行过程中抛出异常,JVM也会根据方法出口的信息来处理异常

相关文章:

Java报错输出的信息究竟是什么?

Java报错输出的信息究竟是什么? 本篇会带大家了解一下java运行时报错输出的信息内容,简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容 异常信息 当你的程序运行报错时,你是否会好奇打印出来的那一大坨红色的究竟…...

解表之紫苏

** 声明:本文介绍的中药仅供学习使用,请勿擅自使用,否则后果自负!!!因水平有限,如有不当之处,请批评指正!!!!图片来源网络&#xff0…...

JavaScript数据类型

目录 JavaScripit数据类型 原始类型(Primitive Types) 1 Undefined 特点 实例 2 Null 实例 3 Boolean 重点: 常用falsy情况: 思考 4 Number,BigInt 实例 特点 NaN 5 String 在JavaScript中表示字符串有三种表示方…...

市场中的新兴力量与未来发展

在当前瞬息万变的全球金融市场中,期货交易以其高杠杆与灵活性,吸引了越来越多的投资者参与其中。大粤期货作为中国期货行业的新兴力量,凭借其创新的交易平台、广泛的产品线及专业的风险管理服务,迅速在市场中崭露头角。本文将介绍…...

Golang | Leetcode Golang题解之第446题等差数列划分II-子序列

题目: 题解: func numberOfArithmeticSlices(nums []int) (ans int) {f : make([]map[int]int, len(nums))for i, x : range nums {f[i] map[int]int{}for j, y : range nums[:i] {d : x - ycnt : f[j][d]ans cntf[i][d] cnt 1}}return }...

Java 常用序列化对比

Java 中常用的序列化方式主要包括以下几种: 1. Java 原生序列化 使用方式: 使用 java.io.Serializable 接口。对象需要实现该接口,然后通过 ObjectOutputStream 和 ObjectInputStream 进行序列化和反序列化。 示例代码: import java.io.*;public class Person impleme…...

【redis学习篇1】redis基本常用命令

目录 redis存储数据的模式 常用基本命令 一、set 二、keys pattern keys 字符串当中携带问号 keys 字符串当中携带*号 keys 【^字母】 keys * 三、exists 四、del 五、expire 5.1 ttl命令 5.2key删除策略 5.2.1惰性删除 5.2.2定期删除 六、type key的数据类型…...

量子计算:颠覆未来计算的革命性技术

量子计算:颠覆未来计算的革命性技术 量子计算作为下一代颠覆性技术,正在引领计算领域的重大变革。与传统计算机基于比特的二进制运算不同,量子计算通过量子比特(qubits)在叠加态和纠缠态下实现并行计算,能…...

ctfshow-web入门(信息收集,持续更新中。。)

写在之前:近期打了个比赛,备受打击,入手了vip账号进修,加油! 文章目录 ctfshow-web1查看源代码ctfshow-web2burp抓包ctfshow-web3burp抓包ctfshow-web4访问robots.txtctfshow-web5dirscarch扫描PHPS文件泄露ctfshow-web6dirscarch扫描ctfshow-web7dirscarch扫描ctfshow-w…...

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC 第一节 硬件解读第二节 CubeMX配置第三节 代码编写 第一节 硬件解读 STM32的ADC是12位,通过硬件过采样扩展到16位,模数转换器嵌入到STM32L071xx器件中。有16个外部通道和2个内部通道&#xf…...

李飞飞谈AI+3D发展:3D/4D AI将成为下一个重要前沿

人工智能(AI)的发展已经深刻改变了我们的世界,从简单的图像识别到复杂的自然语言处理,再到如今正在兴起的生成式模型。在这个过程中,李飞飞教授认为,3D/4D AI技术将是推动下一波变革的关键力量。以下根据她的观点整理了AI发展历程中的关键里程碑以及对3D/4D AI未来发展的…...

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…...

初识算法 · 双指针(4)

目录 前言: 复写零 题目解析 算法原理 算法编写 四数之和 题目解析 算法原理 算法编写 前言: 本文是双指针算法的最后一文,以复写零和四数之和作为结束,介绍方式同样是题目解析,算法原理,算法编写…...

java版鸿鹄电子招投标系统功能架构设计 核心功能设计 鸿鹄电子招投标采购系统源码

java版鸿鹄电子招投标系统功能架构设计 核心功能设计 鸿鹄电子招投标采购系统源码...

matlab 判断多组数据的分布是否一致,可以使用什么方法?

在 MATLAB 中,可以使用以下几种方法来判断多组数据的分布是否一致: 1. Kolmogorov-Smirnov 检验 (K-S Test) K-S 检验是一种非参数检验,用于比较两组数据是否来自相同的分布。MATLAB 提供了 kstest2 函数来进行这种检验。该方法适用于连续分…...

jenkins配置eureka、nacos发布优雅上下线服务

eureka发布期间优雅上下线 1、编写eureka下线脚本 vim biz_out_of_service-eureka.pyimport sys import requests#服务名,脚本第一个参数 APP_NAMEsys.argv[1] # 需要置为OUT_OF_SERVICE的服务实例的ID,脚本第二个参数 INSTANCE_IDsys.argv[2]# Eureka…...

【JAVA开源】基于Vue和SpringBoot的周边产品销售网站

本文项目编号 T 061 ,文末自助获取源码 \color{red}{T061,文末自助获取源码} T061,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

【C++差分数组】2381. 字母移位 II|1793

本文涉及知识点 C差分数组 LeetCode2381. 字母移位 II 给你一个小写英文字母组成的字符串 s 和一个二维整数数组 shifts ,其中 shifts[i] [starti, endi, directioni] 。对于每个 i ,将 s 中从下标 starti 到下标 endi (两者都包含&#…...

【pytorch】范数的计算

近日在看沐神的《动手学深度学习》,其中提到了范数这一数学概念,感觉很陌生,参考ChatGPT补一下知识。 目录 范数示例 1: 计算向量的 L2 范数(欧几里得范数)示例 2: 计算矩阵的 Frobenius 范数示例 3: 计算向量的 L1 范数(曼哈顿距离)曼哈顿范数的定义曼哈顿范数的计算示…...

MATLAB|基于多主体主从博弈的区域综合能源系统低碳经济优化调度

目录 主要内容 程序亮点: 模型研究 一、综合能源模型 二、主从博弈框架 部分代码 结果一览 下载链接 主要内容 程序参考文献《基于多主体主从博弈的区域综合能源系统低碳经济优化调度》,采用了区域综合能源系统多主体博弈协同优化方…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...