String.valueOf引发的错误

本文探讨了使用String.valueOf(byte[])方法时遇到的问题及原因,并给出了正确的转换方式。指出此方法并非直接支持byte[]类型,应使用new String(byte[])构造函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String.valueOf引发的错误

背景

近日在配合客户端调试的时候,客户端无法解析restful返回的失败返回值,需要服务器端配合解决,该问题,查看了服务端的log,返回值以json格式正常返回了,没有异常,那问题出在哪里呢?怀疑是客户端解析问题导致。

分析问题

查看了客户端的解析返回值的代码,发现疑点,客户端使用String.valueOf(byte []),将收到的byte []转换了为String,这就存在问题,因为String提供了valueOf转义,但是没有提供针对byte []的转义,见下:

String valueOf(char data[])
String valueOf(char data[], int offset, int count)
String valueOf(boolean b)
String valueOf(char c)
String valueOf(int i)
String valueOf(long l)
String valueOf(float f)
String valueOf(double d)
String valueOf(Object obj)

针对byte [] 的对象,只能调用String valueOf(Object obj)来进行转义,但是这个方法式依赖Object对象自己的toString()方法的,这里就可能存在隐患。

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
    //Object的的toString方法
        public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

通过上面的代码,我们应该已经知道为什么失败了,因为通过调用的是Object的toString方法,于是乎,我们得到的是类名称+@+散列码十六进制,我们拿着这种格式的字符串,再去做操作,必然是失败的结果。

问题如何解决

解决该问题,其实也很简单,就是用new String(byte bytes[])构建对象就可以了,在这个构造函数中,可以通过,StringCoding.decode,将byte[]转码为char[],而String本省就是底层用final char value[],进行存储的。
例子见下:

byte[] bytes = new byte[]{'c','d'};
String s1 = String.valueOf(bytes);
System.out.println(s1);
String s2 = new String(bytes);
System.out.println(s2);

返回值是 :
s1: [B@3c48403
s2: cd

结语

通过该问题的分析,我们知道,编码不是只是为了编码,不能应付,而是要对自己使用的技术的一些基本原理和一些注意事项有一定的了解,才能避免一些低级错误的产生。

public void executeSQL() { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { try { System.out.println("开始同步用户教师"); EncrypDES encrypDES = new EncrypDES(); List<HashMap<String, Object>> userList = stuBaseEntireMapper.getUser(); List<HashMap<String, Object>> teacherUserList = stuBaseEntireMapper.getTeacherUser(); HybUser user = new HybUser(); user.setIsdel(1); //插入mysql数据库中去 教师 for (HashMap<String, Object> teacherUser : teacherUserList) { HybUser user = new HybUser(); user.setId(Tool.getUUID32()); //TODO ISDEL user.setIsdel(0); user.setCreatetime(new Date()); user.setCreateuser(String.valueOf(teacherUser.get("gh"))); user.setUpdatetime(new Date()); user.setUpdateuser(String.valueOf(teacherUser.get("gh"))); user.setLoginuid(String.valueOf(teacherUser.get("gh"))); // md5加密后小写 取5到25位 String md5_newpasswordbyfrist = Tool.MD5(defaultPassword).toLowerCase().substring(5, 25); //md5_newpasswordbyfrist结果加上loginid的md5加密 String md5_newpassword = Tool.MD5(md5_newpasswordbyfrist + String.valueOf(teacherUser.get("gh"))).toLowerCase(); user.setLoginpwd(md5_newpassword); user.setUserid(String.valueOf(teacherUser.get("gh"))); user.setUsername(String.valueOf(teacherUser.get("xm"))); //根据deptName,得到部门id if (ObjectUtil.isNotNull(teacherUser.get("bmh"))){ String bmh = teacherUser.get("bmh").toString(); HybDept hycDept = deptMapper.getDocByDeptId("0050" + bmh); String deptid = ""; if (ObjectUtil.isNotNull(hycDept)) { deptid = hycDept.getDeptid(); } user.setDeptid(deptid); //TODP POST填充 user.setPost(String.valueOf(teacherUser.get("bmh").toString())); }else { user.setDeptid(""); user.setPost(""); } user.setMobile(encrypDES.encrypt(String.valueOf(teacherUser.get("sj")))); user.setEmail(String.valueOf(teacherUser.get("email"))); //写死 user.setSort(99); user.setIsenabled("是"); user.setLocknum(0); user.setUserattr(2); user.setHeadpic(""); user.setCard("id"); user.setSex(String.valueOf(teacherUser.get("xb"))); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if(teacherUser.get("csrq")!=null) { String date = String.valueOf(teacherUser.get("csrq")); Date parse = format.parse(date); user.setBirthday(parse); } //判断当前用户是否存在多个身份 // int sysUser = userMapper.checkLogin(String.valueOf(teacherUser.get("id")),null); //判断当前用户是否存在 HybUser hybUser = userMapper.getDocByUserId(String.valueOf(teacherUser.get("gh"))); //sysUseri ==0 而 sysUser!=0 用户名存在,但id不存在。则添加兼职 if (ObjectUtil.isNotNull(hybUser)) { //如果用户id存在,则修改该数据 //修改该用户数据 user.setId(hybUser.getId()); userMapper.updateUser(user); } else { userMapper.insertUser(user); } }运行后会有错误
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值