Java getTime()从格式化的String返回null

时间:2017-02-17 13:02:41

标签: java android date nullpointerexception

我有:

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)

3 个答案:

答案 0 :(得分:0)

format.parse(...)语句失败并显示ParseExceptionconvertedFromStringDate位于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);

其中valuesContentValues个实例。

ContentValues.getAsLong返回您存储在null中的long,因此会调用Long.longValue()来导致此NullPointerException

这是自动装箱/拆箱的风险,如果你有

Long wrap_long = null;
long l = wrap_long;

这将编译但会在运行时抛出NPE

long l = null; 

永远不会编译,出于同样的原因,原始值不能是null

当您取消装箱时,最好检查Long值是否为空。