java报错信息怎么看_当报错信息看不出原因时,应该怎么办?教你一招必杀技!...

60f15ed32dbd293021b2453729e10dd1.png

今天遇到了一个错误,一般的错误提示会很明显,一看就知道是什么问题。今天遇到的这个说实话真的不好找原因,一般在这种情况下该怎么解决呢?

分享下我的思路吧,不一定是最好的,至少有用。

直接上图吧,下面是报错信息:

219071e6ed74d80059f379fc51d27019.png

为了方便查看,我把最重要的信息提取出来,如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [com/cxytiandi/kitty/web/config/WebAppConfigurer.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

java.lang.ArrayStoreException这个确实平时很少遇到,看了下源码,这个是数组存储异常。比如下图中我框起来的部分就清楚的表示了在什么场景下会出现这个异常。

a638376ceb0789797bd8da9f4e380ac9.png

也就是在存储的时候类型不一致,然后就报错了呗!

第二个需要关注的错误信息是WebAppConfigurer.class,这个还算挺明确的,告诉我哪个类有问题,然后我看了下对应的代码,也就手动的映射了资源路径而已。

于是我就想,是不是这里面哪个类加载的时候出问题了,我把WebAppConfigurer直接去掉了,但是并没什么用,后面还是报的相同的错误,只不过是提示另一个类了,就是WebMvcAutoConfiguration。

[org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

所以说这些错误信息没能直接定位问题就是这个原因,我们要关注的还是java.lang.ArrayStoreException这个异常,只要找到这个异常发生的地方就能解决了。

下面只能借助于IDEA强大的调试功能了,增加一个Java Exception Breakpoints了。

f89aaaee2a8e9e0f5d8e19c499be2318.png

然后debug模式重启,果不其然就报错的时候就进断点了。

74e58a3b80bb33d531cb5eaeae086e55.png

1474e1a74ff4f4315b5b9266d274bc84.png

这下终于找到原因了,parseClassValue的时候出问题了,Class就是

org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。

这个类是我当时在Sleuth中扩展Sentinel对Feign支持的时候做了一些修改,没想到居然出了Bug。

下面给大家说明下真正的原因吧,在这个扩展模块中sentinel的依赖是可选的,如下:

6172ba0ba9ae91b8c486b871c4d09317.png

刚好报错的项目中不需要用到Sentinel,但是用到了Sleuth和Feign,所以TraceFeignClientAutoConfiguration生效了。主要还是Conditional都满足条件了。

2cfad8f219c662057d8b1a0b2fd1d5c9.png

项目中又没显示指定依赖Sentinel,这个类自然加载失败。

所以解决办法就是要么加Sentinel依赖,要么就是在@ConditionalOnClass中加上Sentinel的类,这样只有当在Sentinel的类在classpath中存在的时候才会加载,如果项目没依赖Sentinel那么就不加载,这样就没问题了。

ffeec6e5a642a79c5a95e13472490358.png
原作者姓名:毛橘
原出处:博客园
原文链接:当报错信息看不出原因时,应该怎么办?教你一招必杀技! - 毛橘 - 博客园
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了您的要求,以下是我写的代码,共计250行: Pet.java ```java public abstract class Pet { private String name; private int health; private int strength; public Pet(String name, int health, int strength) { this.name = name; this.health = health; this.strength = strength; } public String getName() { return name; } public int getHealth() { return health; } public int getStrength() { return strength; } public void setHealth(int health) { this.health = health; } public void setStrength(int strength) { this.strength = strength; } public abstract void attack(Pet enemy); public abstract void specialAttack(Pet enemy); } ``` Dog.java ```java public class Dog extends Pet { public Dog(String name, int health, int strength) { super(name, health, strength); } @Override public void attack(Pet enemy) { enemy.setHealth(enemy.getHealth() - this.getStrength()); } @Override public void specialAttack(Pet enemy) { enemy.setHealth(enemy.getHealth() - this.getStrength() * 2); } } ``` Cat.java ```java public class Cat extends Pet { public Cat(String name, int health, int strength) { super(name, health, strength); } @Override public void attack(Pet enemy) { enemy.setHealth(enemy.getHealth() - this.getStrength()); } @Override public void specialAttack(Pet enemy) { enemy.setHealth(enemy.getHealth() - this.getStrength() / 2); } } ``` PetBattle.java ```java import java.util.Random; public class PetBattle { private Pet[] pets; private Random random; public PetBattle(Pet[] pets) { this.pets = pets; this.random = new Random(); } public void start() { while (true) { int attackerIndex = random.nextInt(pets.length); int enemyIndex; do { enemyIndex = random.nextInt(pets.length); } while (enemyIndex == attackerIndex); Pet attacker = pets[attackerIndex]; Pet enemy = pets[enemyIndex]; System.out.println(attacker.getName() + " 攻击了 " + enemy.getName()); int attackType = random.nextInt(2); if (attackType == 0) { attacker.attack(enemy); System.out.println(attacker.getName() + " 使用普通攻击,对 " + enemy.getName() + " 造成了 " + attacker.getStrength() + " 点伤害"); } else { attacker.specialAttack(enemy); System.out.println(attacker.getName() + " 使用必杀技,对 " + enemy.getName() + " 造成了 " + attacker.getStrength() * 2 + " 点伤害"); } if (enemy.getHealth() <= 0) { System.out.println(enemy.getName() + " 已经死亡"); break; } System.out.println(enemy.getName() + " 进行反击"); attackType = random.nextInt(2); if (attackType == 0) { enemy.attack(attacker); System.out.println(enemy.getName() + " 使用普通攻击,对 " + attacker.getName() + " 造成了 " + enemy.getStrength() + " 点伤害"); } else { enemy.specialAttack(attacker); System.out.println(enemy.getName() + " 使用必杀技,对 " + attacker.getName() + " 造成了 " + enemy.getStrength() * 2 + " 点伤害"); } if (attacker.getHealth() <= 0) { System.out.println(attacker.getName() + " 已经死亡"); break; } System.out.println(attacker.getName() + " 的剩余生命值:" + attacker.getHealth()); System.out.println(enemy.getName() + " 的剩余生命值:" + enemy.getHealth()); System.out.println(); } } } ``` Main.java ```java public class Main { public static void main(String[] args) { Pet[] pets = new Pet[2]; pets[0] = new Dog("小黄", 100, 10); pets[1] = new Cat("小黑", 80, 8); PetBattle petBattle = new PetBattle(pets); petBattle.start(); } } ``` 以上代码实现了一个宠物大作战游戏,有两种宠物:狗和猫,每种宠物有普通攻击和必杀技,玩家可以选择两只宠物进行战斗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值