我有:
String stringDate = "2017-02-16T15:00:00Z"
我想将此转换为日期,之后我想将其转换为Long。这是我的代码:
private void normalizeDate(ContentValues values) {
// normalize the date value
if (values.containsKey(SmogContract.MeasurementEntry.COLUMN_FROM_DATE_TIME)) {
Date date = convertDateFromStringToDate(values.getAsString(SmogContract.MeasurementEntry.COLUMN_FROM_DATE_TIME));
long fromDateValue = date.getTime();
values.put(SmogContract.MeasurementEntry.COLUMN_FROM_DATE_TIME, SmogContract.normalizeDate(fromDateValue));
}
if (values.containsKey(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME)) {
long fromDateValue = values.getAsLong(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME);
values.put(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME, SmogContract.normalizeDate(fromDateValue));
}
}
private Date convertDateFromStringToDate(String stringDate){
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
format.setTimeZone(TimeZone.getTimeZone("GMT"));
Date convertedFromStringDate = null;
try {
convertedFromStringDate = format.parse(stringDate);
} catch (ParseException e) {
e.printStackTrace();
}
return convertedFromStringDate;
}
以下是我得到的例外情况:
java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference
at com.example.marcin.smog_mapa.data.SmogProvider.normalizeDate(SmogProvider.java:109)
at com.example.marcin.smog_mapa.data.SmogProvider.insert(SmogProvider.java:85)
at android.content.ContentProvider$Transport.insert(ContentProvider.java:263)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:163)
at android.os.Binder.execTransact(Binder.java:453)
答案 0 :(得分:0)
format.parse(...)
语句失败并显示ParseException
,convertedFromStringDate
位于null
。
检查控制台是否有堆栈跟踪,并确保stringDate
格式正确。
答案 1 :(得分:0)
好的,所以这个方法只是一个愚蠢的错误。
这是正确完成的:
private void normalizeDate(ContentValues values) {
// normalize the date value
if (values.containsKey(SmogContract.MeasurementEntry.COLUMN_FROM_DATE_TIME)) {
Date date = convertDateFromStringToDate(values.getAsString(SmogContract.MeasurementEntry.COLUMN_FROM_DATE_TIME));
Log.d("ConvertedDate: ", String.valueOf(date.getTime()));
long fromDateValue = date.getTime();
values.put(SmogContract.MeasurementEntry.COLUMN_FROM_DATE_TIME, SmogContract.normalizeDate(fromDateValue));
}
if (values.containsKey(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME)) {
Date date = convertDateFromStringToDate(values.getAsString(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME));
Log.d("ConvertedDate: ", String.valueOf(date.getTime()));
long fromDateValue = date.getTime();
values.put(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME, SmogContract.normalizeDate(fromDateValue));
}
}
答案 2 :(得分:0)
问题来自
long fromDateValue = values.getAsLong(SmogContract.MeasurementEntry.COLUMN_TILL_DATE_TIME);
其中values
是ContentValues
个实例。
ContentValues.getAsLong返回您存储在null
中的long
,因此会调用Long.longValue()
来导致此NullPointerException
这是自动装箱/拆箱的风险,如果你有
Long wrap_long = null;
long l = wrap_long;
这将编译但会在运行时抛出NPE
long l = null;
永远不会编译,出于同样的原因,原始值不能是null
当您取消装箱时,最好检查Long
值是否为空。