fastJson解析空指针异常与防范VS从Map、JSONObject取不存在键值对时的异常情况

本文探讨了FastJSON在解析特定字符串时返回null导致的空指针异常问题,并提供了解决方案。通过封装方法,在解析出null时抛出异常,避免后续调用时的错误。同时,对比了FastJSON与net.sf.json在处理不存在键值对时的不同行为。

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

0x01 问题描述

正常情况下fastJson解析失败会抛异常,但解析字符串数据为null、”“、“ ”这些情况下,fastJson返回null对象而不会抛异常,这样在调用对象时就导致了空指针异常的问题。

0x02 解决方案

对此,不亦对其进行了一个简单的封装,在上述情况解析出null对象时直接抛异常。

0x03 代码

import com.alibaba.fastjson.JSON;

public class JsonUtil{
    public static <T> T parseObject(String text, Class<T> clazz) throws Exception{
        try {
            T t= JSON.parseObject(text,clazz);
            if(null==t) {
                throw new Exception("parseObject NullPointerException");
            }else {
                return t;
            }
        } catch (Exception e) {
            throw e;
        }
    }
}

1.在Map中取不存在的键值对时不会报异常,只会返回null。

@Test
    public void testMap() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("d", 10);
        Object b = map.get("c");
        System.out.println(b);
    }


//打印结果是:null。
结论:从map中取出不存在的键值对时不会报异常,会返回null。
2.在JSONObject中取不存在的键值对时分两种情况:

利用jSONObject.get(Object key)方法及get(String key)取不存在的键值对时不会报异常,会返回null;但是利用jSONObject.getxxx(String key)方法取时会报空指针异常:

@Test
    public void testJSONObject() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("d", 10);
        JSONObject jSONObject = JSONObject.fromObject(map);
        int xx = jSONObject.getInt("d");
        System.out.println(xx);
        // 从jSONObject中用get(Object key)方法取出不存在的键值对时不会报异常,会返回null
        Object y = jSONObject.get("dd");
        System.out.println(y);
        // 从jSONObject中用getxxx(String key)方法取出不存在的键值对时报异常
        String y2 = jSONObject.getString("dd");
        System.out.println(y2);
    }

但是使用fastjson就不会出现这种错误,主要是还是两者源码方法的实现逻辑不同:

1.net.sf.json.JSONObject
 public String getString(String key) {
        this.verifyIsNull();
        Object o = this.get(key);
        if (o != null) {
            return o.toString();
        } else {
            throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] not found.");
        }
    }
2.com.alibaba.fastjson.JSONObject
public String getString(String key) {
        Object value = this.get(key);
        return value == null ? null : value.toString();
    }

对null处理时会报空指针异常:

@Test
    public void testNull() {
        Object o = null;
        System.out.println(o);
        String s = (String) o;
        System.out.println(s);
        // System.out.println(s.getClass());
        User u = (User) o;
        System.out.println(u);
        // System.out.println(u.getClass());
    }


//打印结果:
//null
//null
//null
分析可知:不管null是何种类型,Object null或者String null或者其他类型的null,调用getClass()方法时都会报空指针异常。
如果是Object null,则可以转为其他类型的null,因为其他类型都是Object的子类。但是其他类型的null不能随便转类型,除非是有父子关系的类型。例如,如果String类型的想转为User类型的,就会有编译错误,说Cannot cast from String to User。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值