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

本文主要是介绍fastJson解析空指针异常与防范VS从Map、JSONObject取不存在键值对时的异常情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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。

@Testpublic 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)方法取时会报空指针异常:

@Testpublic 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)方法取出不存在的键值对时不会报异常,会返回nullObject 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处理时会报空指针异常:

@Testpublic 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。

这篇关于fastJson解析空指针异常与防范VS从Map、JSONObject取不存在键值对时的异常情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084118

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑