zoukankan      html  css  js  c++  java
  • java.lang.NumberFormatException: multiple points问题

    一般这种问题主要是因为SimpleDateFormat在多线程环境下,是线程不安全的,所以如果你在多线程环境中共享了SimpleDateFormat的实例,比如你在类似日期类中定义了一个全局的SimpleDateFormat对象,这样子肯定会出现上述的报错,比如你的代码是这样的

     1 package com.yongcheng.liuyang.utils;
     2 
     3 import java.text.ParseException;
     4 import java.text.SimpleDateFormat;
     5 import java.util.Date;
     6 
     7 /**
     8  *
     9  * 
    10  * @author Administrator
    11  *
    12  */
    13 public class DateUtils {
    14 
    15     private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    16     
    17     public static Date covertDateStrToDate(String dateStr){
    18         
    19         try {
    20             return format.parse(dateStr);
    21         } catch (ParseException e) {
    22             e.printStackTrace();
    23         }
    24         return null;
    25     }
    26 }

    如果是上述代码,那么在多线程环境下,你可能会收到如标题所示的错误。

    解决办法

    1、建议在每个方法中都new一个新的SimpleDateFormat对象,这样子就可以避免这种问题。

    2、也可以使用保存线程局部变量的ThreadLocal对象来保存每一个线程的SimpleDateFormat对象,小编主要说说第二种的使用,针对上述代码做的改变。

     1 package com.yongcheng.liuyang.utils;
     2 
     3 import java.text.ParseException;
     4 import java.text.SimpleDateFormat;
     5 import java.util.Date;
     6 
     7 /**
     8  *
     9  * 
    10  * @author Administrator
    11  *
    12  */
    13 public class DateUtils {
    14 
    15 private static final String format = "yyyy-MM-dd";
    16     
    17     //每一个线程
    18     private static final ThreadLocal<SimpleDateFormat> threadLocal = new 
    19             ThreadLocal<SimpleDateFormat>();
    20     
    21     public static Date covertDateStrToDate(String dateStr){
    22         SimpleDateFormat sdf = null;
    23         sdf = threadLocal.get();
    24         if (sdf == null){
    25             sdf = new SimpleDateFormat(format);
    26         }
    27         //
    28         Date date = null;
    29         try {
    30             System.out.println("当前线程为:" + Thread.currentThread().getName());
    31             date = sdf.parse(dateStr);
    32         } catch (ParseException e) {
    33             e.printStackTrace();
    34         }
    35         
    36         return date;
    37     }
    38 }

    好了,问题解决,在多线程环境下,一定要注意共享变量的线程安全问题,如无特殊必要,建议不要随便定义静态公共变量,如果非要定义,建议考虑好多线程的问题!

    package com.yongcheng.liuyang.utils;
    import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;
    /** * *  * @author Administrator * */public class DateUtils {
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");public static Date covertDateStrToDate(String dateStr){try {return format.parse(dateStr);} catch (ParseException e) {e.printStackTrace();}return null;}}

  • 相关阅读:
    Word Frequency
    House Robber(动态规划)
    链表的排序 时间复杂度O(nlogn)
    gdb调试(转)
    c实现的trim函数
    c实现的trim函数
    mac下安装pyQt4
    哈夫曼编码详解
    IOS7--javascriptcore中jscontext使用要注意的一点
    Docker mysql 连接 “The server requested authentication method unknown to the clien”错误
  • 原文地址:https://www.cnblogs.com/ljy-20180122/p/9520621.html
Copyright © 2011-2022 走看看