说明:本文介绍一次封装对象时的空指针异常
场景
项目有一个定时任务,会去获取sftp服务器上的json文件,下载,解析,在封装成对象时返回了null,代码片段如下(已脱敏)
private static String getJsonObject(String fileName) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 省略:下载sftp文件,到byteArrayOutputStream里
return JSON.parseObject(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), String.class);
}
分析&解决
我将sftp上的json文件下载下来看了,内容没有问题。然后对比能解析成功的json文件,发现了问题,如下:
两个文件的字符编码不一样,UTF-8的能解析成功,ANSI的不能。因为上面代码是针对UTF-8的,在下载文件,写入到byteArrayOutputStream是乱码的,在转为String类型时就返回了null。
解决方法:更改文件的字符集编码,或将代码改成如下:
private static String getJsonObject(String fileName) throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 省略:下载sftp文件,到byteArrayOutputStream里
return baos.toString();
}
不用JSON.parseObject(),直接toString(),能返回数据,但是文字是乱码的。