SimpleDateFormat未抛出ParseException
关于SimpleDateFormat的不严格性【技术探讨】
今天一组员写了几段Java代码,发现如下问题:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
System.out.println(sdf.parse(timestamp.toString()));
此语句居然没有报异常,于是写了下面一段代码
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
System.out.println(sdf.parse("2017-06-08 15:49:53.395"));
效果同第一段代码一样,没有报异常,输出为Tue Dec 06 00:08:15 CST 2016
针对于些,找了网上的一些内容,在
http://bbs.csdn.net/topics/190075531第9楼找到的结果
根据此,找到相关的JavaDoc内容,看到如下内容
SimpleDateFormat 继承于DateFormat
SimpleDateFormat.parse()->DateFormat.parse(String source)->DateFormat.parse(String source, ParsePosition pos)->SimpleDateFormat.parse(String source, ParsePosition pos)
根据DateFormat的public abstract Date parse(String source, ParsePosition pos)方法注解,存在如下内容:
* <p> By default, parsing is lenient: If the input is not in the form used
* by this object's format method but can still be parsed as a date, then
* the parse succeeds. Clients may insist on strict adherence to the
* format by calling {@link #setLenient(boolean) setLenient(false)}.
译文如下:
一般来说,解析是不严格的。如果输入不符合Object的格式(即定义的SimpleDateFormat),仍会被解析成一个日期,这个解析是成功的。开户者如果坚持严格校验输入的格式的话,请使用方法etLenient(boolean) 设置属性setLenient(false)
根据此,写了如下代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
sdf.setLenient(false);
System.out.println(sdf.parse("2017-06-08 15:49:53.395"));
正常抛出异常ParseException,测试通过,只是以后再做解析时,需要再多加一行代码了
此问题,我在Java 6u45 32位,Java 8u131 64位中测试通过,应该普遍存在于Java6~Java8中,望使用者注意
附加信息,在某些情况下,SimpleDateFormat会自动处理,即setLenient(true)的情况下,并且,有些情况下,即使setLeniet(true),也会抛出ParseException。具体逻辑,可能还需要根据源码再行分析……
感谢 http://bbs.csdn.net/topics/190075531
原文:https://blog.csdn.net/lengmohui668/article/details/79678047
SimpleDateFormat未抛出ParseException的更多相关文章
- 多线程状态下调用SimpleDateFormat.format()抛出 ArrayIndexOutOfBoundsException 异常
本来想在类的顶部设置一个 静态的SimpleDateFormat常量 public final static DateFormat dateFormatGMT = new SimpleDateForm ...
- 页面打开 抛出w3wp.exe 中发生未处理异常
页面打开 抛出w3wp.exe 中发生未处理异常
- Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出 package com.test; import org.apach ...
- java 错误: 未报告的异常错误Exception; 必须对其进行捕获或声明以便抛出
import java.io.FileInputStream; import java.util.Properties; import java.sql.Connection; import java ...
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
- WCF服务创建与抛出强类型SOAP Fault
原创地址:http://www.cnblogs.com/jfzhu/p/4060666.html 转载请注明出处 前面的文章<WCF服务的异常消息>中介绍过,如果WCF Service发生 ...
- 窥探Swift编程之错误处理与异常抛出
在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...
- Spring异常抛出触发事务回滚
Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*) ...
- Spring事务异常回滚,捕获异常不抛出就不会回滚(转载) 解决了我一年前的问题
最近遇到了事务不回滚的情况,我还考虑说JPA的事务有bug? 我想多了....... 为了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志.但是这边情况来了,当这个方法异常 ...
随机推荐
- 网络基础协议part 1
1.计算机与计算机之间如何进行联系? 两个独立的计算机是无法进行交流的,如同人一样,如果没有语言的存在就不能正常的交流.而在计算机领域,互联网协议就如同一门计算机与计算机交流的语言.但是为了全世界人们 ...
- Introduction to Cryto & Crptocurrencies Lecture 1
Lecture 1.2 Hash Pointer & Data Structure Use Case 1. 什么是Block Chain呢? 想象一个像链表一样的结构,只不过与通常的指向下一块 ...
- mq(1):简介
1.mq的使用场景 以前的我,一直都没太搞明白,为什么我们那么需要消息队列,直到我看到了网友scienjus.的这个例子. 例子:假设用户在你的软件中注册,服务端收到用户的注册请求后,它会做这些操作: ...
- Saiku部分函数解析(八)
Saiku函数解析 1. now() : 获取当前日期 直接使用即可 2. IIF(logic_exp, string, string): IIF判断,logic_exp是逻辑表达式,结果为t ...
- PC/FORTH 数字类型
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- SpringMVC防止表单重复提交
最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦. 后来在网上搜索后发现 ...
- HashMap和Hashtable有什么区别?
HashMap和Hashtable都是实现Map接口的,但是: 1.HashMap允许键和值都是null的,而Hashtable不允许键和值为null 2.Hashtable是同步的,而HashMap ...
- PE文件 01 导入表
0x01 导入表结构 数据目录表中的第二个成员标记了导入表的RVA和Size大小,由此可以定位到导入表: typedef struct _IMAGE_DATA_DIRECTORY { DWORD ...
- 1043 输出PATest
给定一个长度不超过 104 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种 ...
- <Java><类与对象><OOP>
Overview 类 封装(encapsulation): 也称为数据隐藏.从形式上看,是将数据与行为组合起来,并对对象的使用者隐藏了数据的实现方式.封装给对象赋予了黑盒特征,提高重用性和可靠性. 继 ...