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也会根据方法出口的信息来处理异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443100.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海AI Lab视频生成大模型书生.筑梦环境搭建推理测试

引子 最近视频生成大模型层出不穷,上海AI Lab推出新一代视频生成大模型 “书生・筑梦 2.0”(Vchitect 2.0)。根据官方介绍,书生・筑梦 2.0 是集文生视频、图生视频、插帧超分、训练系统一体化的视频生成大模型。OK,那就让我们开始吧。 一、模…

怎么将手机备忘录传送至电脑

在数字化时代,手机备忘录已成为我们生活中不可或缺的一部分。无论是记录购物清单、工作事项,还是灵感闪现的瞬间,手机备忘录都能随时记录下这些宝贵的信息,帮助我们防止遗忘。然而,有时候我们需要将这些备忘录内容转移…

AtCoder Beginner Contest 374

C - Separated Lunch 题目&#xff1a; 思路&#xff1a; dfs枚举每个数是否选入a数组中&#xff0c;求和比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long LL;const int N25;int a[N]; bool st[N]; int mn0x3f3f3f3f; int sum; …

thinkphp 学习记录

1、PHP配置 &#xff08;点开链接后&#xff0c;往下拉&#xff0c;找到PHP8.2.2版本&#xff0c;下载的是ZIP格式&#xff0c;解压即用&#xff09; PHP For Windows: Binaries and sources Releases &#xff08;这里是下载地址&#xff09; 我解压的地址是&#xff1a;D:\…

webGL进阶(一)多重纹理效果

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

初始Linux(二)基础命令

前言&#xff1a; 之前那一篇我们已经介绍了一部分的基础命令&#xff0c;当然那只不过是九牛一毛&#xff0c;本篇我们继续介绍一些比较重要且需要掌握的基础命令。 mv命令&#xff1a; 其实这个命令有两个功能&#xff0c;一个是移动&#xff08;剪切&#xff09;文件&#…

【LeetCode】每日一题 2024_10_9 找到按位或最接近 K 的子数组(LogTrick、位运算)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;找到按位或最接近 K 的子数组 代码与解题思路 今天是 2100 的题目&#xff0c;难度略高&#xff0c;不在我的能力范围&#xff0c;推荐题解&#xff1a;两种方法&#xff1a;LogTrick/滑…

【优选算法】--- 位运算

位运算 一、常见的位运算总结&#xff08;重点&#xff01;&#xff09;1、关于位运算的符号2、&#xff08;判断&#xff09;给一个数字n&#xff0c;确定它的二进制表示中的第X位&#xff0c;是1还是0&#xff1f;3、&#xff08;修改&#xff09;如何把一个二进制的数字的第…

计算机、大数据与人工智能国际学术会议

第五届计算机、大数据与人工智能国际会议由景德镇陶瓷大学主办&#xff0c;西安交通大学、暨南大学、南京邮电大学、长沙学院、景德镇学院、爱迩思出版社&#xff08;ELSP&#xff09;协办。会议于2024年11月1日~3日在江西景德镇举行。在本次会议上发表的文章将出版到会议论文集…

目标检测实战教程Day1(原创)

原创不易&#xff0c;转载请标明本文地址 目标检测一直是计算机视觉领域的核心问题之一&#xff0c;它就像是让计算机拥有了一双“鹰眼”&#xff0c;能在复杂的图像中迅速锁定和识别出各种有趣的目标&#xff0c;比如人、汽车、动物或者任何其他特定物体。在这一章&#xff0c…

NeuVector部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、安装方法2.1.1、部署NeuVector前的准备工作2.1.1.1 扩容系统交换空间2.1.1.2 Kubernetes单机部署2.1.1.2.1 部署Docker2.1.1.2.2 部署Kubectl2.1.1.2.3 部署Minikube 2.1.1.3 Helm部署 2.1.2、使用Helm部署NeuVector 2.2、使用方法2.2.1…

跟《经济学人》学英文:2024年09月28日这期 The curse of the Michelin star

The curse of the Michelin star Restaurants awarded the honour are more likely to close, research finds 原文&#xff1a; The twelve new restaurants added to the New York Michelin Guide this month, serving up cuisine ranging from “haute French” to “eco…

【springboot9735】基于springboot+vue的车辆充电桩

主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路&#xff0c;关注作者有好处 项目描述 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;车辆充电桩…

LabVIEW交直流接触器动态检测系统

LabVIEW软件与霍尔传感器技术结合的交直流接触器动态检测系统通过实时数据采集和处理技术&#xff0c;有效地测量并分析交直流接触器在吸合及吸持阶段的电流和电压变化&#xff0c;以及相应的功率消耗&#xff0c;从而优化电力和配电系统的性能和可靠性。 项目背景 交直流接触…

【Linux:线程控制】

目录 线程的创建与等待&#xff1a; ​编辑 代码中tid是什么&#xff1f; 如何看待线程函数传参&#xff1f; ​编辑 ​编辑创建多线程&#xff1a;​编辑 终止多线程&#xff1a; 线程分离&#xff1a; 线程封装&#xff1a; 线程的创建与等待&#xff1a; void *thre…

在docker中安装并运行mysql8.0.31

第一步&#xff1a;命令行拉取mysql镜像 docker pull mysql:8.0.31查看是否拉取成功 docker images mysql:latest第二步&#xff1a;运行mysql镜像&#xff0c;启动mysql实例 docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD"123456" -d mysql:8.0.313307:3307前…

51单片机的智能水温控制系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器LED和按键等模块构成。适用于智能热水器控制、泳池水温控制系统等相似项目。 可实现功能: 1、LCD1602实时显示水温信息和上下限 2、温度传感器DS18B20采集水体温度 3、当温度低于下限&#xff0…

Linux环境通过APT 仓库安装版PostgreSQL 数据库实战

Linux环境通过APT 仓库安装版PostgreSQL 数据库是运维人员常见的需求之一&#xff0c;今天我们一步一步演示一下&#xff1a; 1、添加 PostgreSQL APT 仓库 确保你的系统更新&#xff0c;然后添加 PostgreSQL 的官方 APT 仓库。 sudo apt update sudo apt install -y wget w…

基于MindSpore实现CycleGAN壁画修复

基于MindSpore实现CycleGAN壁画修复_哔哩哔哩_bilibili 本案例运行需要较大内存&#xff0c;建议在Ascend/GPU上运行。 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation us…

大模型日报|7 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.上交大团队新研究&#xff1a;像专家一样大规模提升预训练数据质量 大语言模型&#xff08;LLM&#xff09;的预训练历来依赖于人类专家为提高语料库质量而精心设计的启发式方法&#xff0c;迄今为止已开发出大量规…