• 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;}}

  • 相关阅读:
    Android 源代码在线查看
    Android天气预报程序开发
    为自己的网站写个api接口
    Windows Server 2012改造成Windows8的方法(新增解决网络卡)
    完整java开发中JDBC连接数据库代码和步骤
    RF频偏
    通信系统架构,RF架构
    RF 速率与引导码preamble关系
    ubuntu虚拟机共享无线网上网
    win7下AdHoc网络设置共享外网上网
  • 原文地址:https://www.cnblogs.com/ljy-20180122/p/9520621.html
Copyright © 2020-2023  润新知