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中打印日志.但是这边情况来了,当这个方法异常 ...
随机推荐
- [转载]mysqlcreate新建用户host使用%,本地无法连接原因及解决方法
转载自 http://www.2cto.com/database/201307/225781.html mysql,因为root权限过高,所以新建一用户appadmin,权限仅为要用到的数据库.创建语 ...
- redis:集群配置
一.redis集群相关 1.概念:redis集群是通过数据分区提供可用性的,这样即使一部分节点失效也可以继续处理请求. 2.原理:集群使用数据分片实现,一个redis集群包括16384个哈希槽,数据库 ...
- 【原创】<Debug> not positioned on a valid record
[Problem] QSqlQuery::value: not positioned on a valid record QSqlQuery :: value:未定位在有效记录上 [Solution] ...
- docker 部署 flask(三)高级编写及生成镜像,安装requirements.txt
简介: 上一篇,我写了如何使用别人的docker基础镜像,生成我们的docker镜像. 也就最基本的flask,没有别的库(包)支持.连数据库支持都没有. 也就让大家了解一下怎么生成镜像而已. 本篇介 ...
- 每天CSS学习之transform-origin
在上一篇中,我们学习了如何使用transform来进行2D变形.今天要讲述的transform-origin与这个变形有关. origin翻译过来的意思是原点.开端.transform-origin寓 ...
- node fs 解决回调地域问题
promisify问题 promisify = require('util).promisify const read = promisify( fs.readFile); read('input.t ...
- Bootstrap datepicker 在弹出窗体modal中不工作
解决办法 在 show 方法后面 添加 下面一段代码 $('#modalCard').modal('show');—例子 打开 弹出窗体 //$('#modalCard').modal('hide') ...
- kubernetes 环境搭建(ubuntu16.04)
通过kubeadm安装kubernetes的教程:1: 首先在每台机器上安装: docker(1.12), kubeadm(1.6), kubectl, kubelet, kubernetes-cni ...
- Mybatis学习笔记三
一.延迟加载 延迟加载即加载延迟了,并不是一次性加载完而是按需加载,感觉应该是针对多表查询而言的,即先查询单表等需要另一张表的信息时再去加载,这样能提高数据库的性能: 需要注意的是,mybatis提供 ...
- js基础 三种弹出框 数据类型
总结:js三个组成部分ES:语法DOM:对象模型 => 通过js代码与页面文档(出现在body中的所有可视化标签)进行交互BOM:对象模型 => 通过js代码与浏览器自带功能进行交互 引入 ...