0
点赞
收藏
分享

微信扫一扫

【异常】java.lang.Integer cannot be cast to java.lang.String

pipu 2022-04-13 阅读 84
java

目录

一.问题描述

二.问题分析

1/ 2 关于BootStrapLoader的问题

2 / 3 java.lang.Integer cannot be cast to java.lang.String (属于ClassCastException)

解决方法

3 / 3 出现问题的理由

补充

Object转String的4种方法

【1/4】Object.toString()

【2/4】String.valueOf(object)

【3/4】(String)object

②但是!!!要是转为String的时候,如果字符串的内容是数字的话,这样转就会报强转异常,就是本文遇到的问题!

【4/4】object + ""

Object转Long或者int


一.问题描述

java.lang.ClassCastException: 
//Long不能被强转为String
class java.lang.Long cannot be cast to class java.lang.String 
// 这个不知道是啥
(java.lang.Long and java.lang.String are in module java.base of loader 'bootstrap')

业务上用mybatis数据库操作 , 返回值用Map<String,Object>接收 , 在map.get("key")时报错了

condition.setLogUsernum(Integer.parseInt((String)(strategyMap.get("log_usernum"))));

二.问题分析

1/ 2 关于BootStrapLoader的问题

文尾有阐述 , 这里有两种迅速解决的方法

① 当前如果用的是mysql的话 ,

把pom内mysql依赖的版本修改一下 ,

因为有可能是mysql驱动的问题 ,

将版本修改为8.0.22 (原来的驱动版本是8.0.26)

②修改JDK版本 :

打开ProjectStructure → Platform Settings→SDKs → 1.8改为8

打开ProjectStructure→ Project → ProjectSDK → 1.8改为8

------------------------------------------------------------------------------------

2 / 3 java.lang.Integer cannot be cast to java.lang.String (属于ClassCastException)

 我直接用(String)map.get("log_usernum")就报这个错了 一步步看

①对于刚才的代码 , 其实改Map<String,String>接收不可行 , 因为实际上还是会使用String<String,Object>来接收

②所以在用mybatis拿数据的时候 , 由于我设定的这个字段是int类型 , 对应返回的类型是Integer

问题在哪 : 

虽然我在造Map接收的时候用的是<String,Object> , 于是直接map.get.var的时候返回的是Object logUsernum

但是报错的时候显示的是强转异常的 : Long→×→String

我的理解是虽然var后返回的是Object , 但是扒出来的是Long ,

然而java里这里其实long对着数据库类型的话是bigint对吧

然鹅我库内对logUsernum这个字段的类型设置的是int ,对不上了

虽然我到底还是没扒明白根源问题出在哪里了。。但是为了代码继续跑

我和他的

解决方法

一样 , 进行类型转换 , 先转String后转我要的类型 

// 不能直接这样写
int usernum = map.get("log_usernum")
// 修正步骤
String usernumStr = String.valueOf(map.get("log_usernum"));
int usernum = Integer.parseInt(usernumStr)

3 / 3 出现问题的理由

备注:不是最根源的理由啊是为啥报错了啊,根源的理由我还是没扒出来,但是可以知道什么情况会报错,注意一下!dbq等我看源码的功底加深扒出来以后会回来填坑的!

先看这个例子

// 先定3个变量 : Integer一个,String内容为字母的一个,String内容为数字的一个
Integer integerNum = 123;
String alpha = "abc";
String stringNum = "321";
-------------------------------
Map map = new HashMap<>();
map.put("onlyNum",integerNum);
map.put("onlyAlpha",alpha);
map.put("stringNUM",stringNum);
-------------------------------
// 塞好后接下来进行取值
Integer getIntegerNum = (Integer)map.get("onlyNum");
// 可以看到塞进去的时候是Integer类型的话,拿出来的时候用强转可以顺利拿到值;

Integer getStringNum - (Integer)map.get("stringNUM");
// 这个会报错
// 意思就是,如果你map.put的时候是String类型的,但是内容还是数字的话就会报错
// 备注:这里报的String→Integer强转的报错,和本文的都是ClsasCastException强转问题

// 解决
// 也是先转为String类型后再用Integer.parseInt转即可,如下:
Integer.parseInt(map.get("stringNUM").toString());

小结 : 不管定义的map是Map map 还是new个HashMap<标明kv类型>等 

①当你map.put塞的是Integer类型时 , 强转是不会报错的

②如果你塞的是String类型,但是内容却是数字,比如"123"这样的 ,就需要

先把map.get("key")先转为String类型,再使用Integer.parseInt(转好成String类型后放这)就好了

=====================================================================

补充

在map.get("key")所取的value值为String的时候也是不能直接(String)或者直接加""这样的,还是会报错,如下:

// 报错1
String logUsername = (String)map.get("log_username");
// 报错2
String logUsername = map.get("log_username") + "";

当前结果无法强制转换成String

因为将自己写的和反编译后的.class文件进行对比发现变这样了 

// .class的是这样的
String logUsername = (String)map.get("log_username") + ""

 所以咋办 : 用String.valueOf(map.get("log_username"))

没有深究 , 水平还比较渣停留在解决问题+扒报错和源码看一点点,努力ingQAQ

========================================================================

那这样的话 , 这么多Object转String的方法 , 使用上有啥区别 , 所以我又去扒了一下看看

Object转String的4种方法


【1/4】Object.toString()

①object不能为null,否则会报nullpointexception

②我怎么斟酌要不要用这个方法 : 百分百确认不为null , 如果可能会出现null的话看情况:

→如果是检查代码取值的话 , 就会抓一下抛异常给我自己检查的时候看见

→一般业务的时候都会做判空 , null了的话就自己抓然后写业务异常"xx不能为空!"这样 , 或者比如新用户没设置名字的话判空的时候if(xx为null)就设一个默认值给他(比如默认名字"用户+一串随数字"来作为他的用户名)

→如果单纯是想避免空指针可以用下面别的方法

【2/4】String.valueOf(object)

①这个就不担心object为null抛NullPointerException了,因为null的话会变成字符串"null"放在上面

千万要注意null 和 字符串"null"不是同一个东西啊

②我怎么斟酌要不要用这个方法 : 几乎没怎么用过- -除了测试代码图方便的时候这样用过几次

【3/4】(String)object

①不担心object为null抛NullPointerException (但是后面咋样我不知道哈哈

②但是!!!要是转为String的时候,如果字符串的内容是数字的话,这样转就会报强转异常,就是本文遇到的问题!

③我怎么斟酌要不要用这个方法 : 很少没怎么用过,偶尔测试的时候玩一下会用

【4/4】object + ""

不担心object为null抛NullPointerException,因为null的话会变成字符串"null"放在上面

和String.valueOf(object)一样意思

②我怎么斟酌要不要用这个方法 : 也是几乎没用过,偶尔测试玩一下会用

=============================================================

Object转Long或者int

鉴于上文这么多教训。。。以后就这么干 : 

先将 Object 类型转换为 string,再将 string 转换为 long/int

至于用toString()还是String.valueOf(object)根据上文阐述按自己需求选。。

 

举报

相关推荐

0 条评论