页面500报String.hashCode?真相:switch变量是null
页面 500,控制台报错停在 String.hashCode——代码看着没毛病,switch 里的字符串也写得清清楚楚。真相是:那个字符串变量是 null。
原理:switch 对字符串做了什么
Java 7 开始,switch 支持 String。但底层 JVM 的 switch 只能按整数分派,所以编译器在背后做了翻译:先把字符串算出哈希值,switch 实际按哈希值跳转,命中分支后再用 equals() 比对一次原文(防止两个不同字符串哈希碰撞)。
所以 switch 一个字符串,第一步就是调用变量.hashCode()。变量是 null,调 hashCode() 就抛 NullPointerException——报错行停在 String.hashCode,把凶手明明白白写了出来。
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.hashCode()" because "<local2>" is null at Test.main(Test.java:9)顺带一提:新版 JDK(17 以上)的报错更直白——它直接告诉你"因为 null"(上面那句 because … is null),连排查都省了;老 JDK 只会甩一行 String.hashCode 让你自己猜。看到这种报错,第一反应就应该是:哪个字符串是 null?
修法
switch 之前先判空,或者给变量一个默认值:
if(type==null){type="guest";}switch(type){case"admin":System.out.println("管理员");break;default:System.out.println("其他");}重新运行,正常。
总结
记住这条:报错行不会说谎。看到 String.hashCode,先查你的字符串是不是 null。同理,看到别的"奇怪"报错行,先问一句:这一行在干什么?答案往往就是真相。
需要SpringBoot管理系统源码、SQL脚本、部署文档做学习参考,可以私信联系。项目仅作为编程学习、课程设计参考素材,不代写论文。