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