首页 > 编程语言 >Debug - Method threw 'java.lang.StackOverflowError' exception

Debug - Method threw 'java.lang.StackOverflowError' exception

时间:2022-11-17 15:23:04浏览次数:46  
标签:lang exception java String toString address new Method

 

一、问题背景

报错信息:

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.huatai.nats.model.quant.basic.ComparableSecurityMonitoring.toString()

 

 

 

二、该错误的本质

根本上是因为实例之间的互相引用

 

 

三、本问题的解决方法

3.1 这里有一个Map<String, ComparableSecurityMonitoring> 储存所有的ComparableSecurityMonitoring. key为headsSecurityId

3.2 ComparableSecurityMonitoring 还有一个属性是List<ComparableSecurityMonitoring>ChildrenList

3.3 这里有一个father ComparableSecurityMonitoring (其需要从3.1的map获取),需要填充其ChildrenList(所有的child也需要从3.1的map获取) 

4.一旦用户错误的将 father 设置为自己的child, 那么在设置的时候,就会出现循环引用 -- 我添加我自己到ChildrenList属性里

 

 

四、其他类似问题解决方案

详见:https://blog.csdn.net/Saintmm/article/details/117335502

一、背景
今天在做项目中发现A类与B类的关系是1:n,即A类中有一个List<B> bList的成员变量,B类中有一个A a的成员变量。

当执行A.getBList().add(b)方法时会报错:Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.saint.start.gaia.A.toString()

 

 

 

二、原因
StackOverFlow问题,顾名思义是栈溢出的意思,Java虚拟机在实际调用方法时会设置最大栈深度,防止其暴走直接占用满所有内存。

根本上是因为实例之间的互相引用!和Spring中的循环依赖很相似。

因为Debugger会调用对象的toString()方法以显示对象中的所有数据信息。然后,我的所有对象都使用lombok的@Data注解重写了toString()方法。问题就出在这里,这意味着程序会不断地调用A类和B类的toString()方法,永不停止,结果就造成了StackOverFlow的问题。

三、解决方案
在类中重写toString()方法,不打印互相引用的类成员变量,避免这种循环调用的产生。

 

四、实例
// A类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
* @author Saint
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String name;
private List<User> userList;

@Override
public String toString() {
return name;
}
}

// B类
/**
* @author Saint
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
private String name;

private Address address;

@Override
public String toString() {
return name;
}
}

// main方法
public class Main {

public static void main(String[] args) {
Method m = new Method();
Address address = new Address("nanjing", new ArrayList<>());
User ha = new User("ha", address);
address.getUserList().add(ha);
User user = new User("start", address);
address.getUserList().add(user);
}
}

 

标签:lang,exception,java,String,toString,address,new,Method
From: https://www.cnblogs.com/frankcui/p/16899585.html

相关文章

  • Kafka启动报错:/bin/kafka-run-class.sh: line 258: exec: java: not found
    Kafka启动报错处理:/opt/module/kafka/bin/kafka-run-class.sh:第258行:exec:java:未找到今天在安装kafka后启动的时候出现了报错:/software/kafka_2.11-0.11.0.0/bin......
  • object类(查看JDK原码,子类重写equals,hascode,toString,finalize)--JAVA
    一、equals==      publicclassequals{//把光标放在equals方法,直接输入ctrl+b--查看jdk源码publicstaticvoidmain(String[]args){Pers......
  • JavaScrip语法-一元运算符、算数和比较运算符
    JavaScrip语法-一元运算符 一元运算:只有一个运算数的运算符++,--,+(正号),-(负号)++(自增)--(自减)++(--):在前,先自增(自减),再运算++(--):在前,先运算,再自增(自减)+(-):正负号注意:在JS中,如......
  • JavaScript_语法_与html结合方式与JavaScript_语法_注释&数据类型
    JavaScript_语法_与html结合方式EMCAScript:客户端脚本语言的标准1.基本语法1.......
  • Java 基本程序设计结构
    1.基本程序框架package*;//表示这个文件属于哪个包import*;//引入一些库,不必重复造轮子/**name:Java基本程序框架*describe:NULL*///public称为......
  • 【Java】dto转json
    <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency>importcom.alibaba.fastjson.......
  • Java 概述
    1.Java介绍Java是一个完整的平台,有一个庞大的库,库中包含大量可重用的代码,以及一个提供诸如安全行、跨操作系统可移植性以及自动垃圾回收功能的执行环境Java是一......
  • Java 基础
    一.Java程序设计概述1.Java介绍Java是一个完整的平台,有一个庞大的库,库中包含大量可重用的代码,以及一个提供诸如安全行、跨操作系统可移植性以及自动垃圾回收功能......
  • Java 开发环境配置
    1.JDK、JRE和JVMJDK:JavaDevelopmentToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(JRE),Java工具(javac/java/jdb等)和Java基础的类库(即JavaAPI)......
  • SpringBoot报错 java.lang.IllegalArgumentException: class org.springframework.boo
    多版本SpringBoot版本冲突java.lang.IllegalArgumentException:classorg.springframework.boot.cloud.CloudFoundryVcapEnvironment是版本问题classorg.springframe......