Как мне исправить ошибку NullPointerException для следующего кода? - PullRequest
2 голосов
/ 20 августа 2011

У меня есть этот код, и когда я запускаю скрипт, я передаю допустимые параметры, но продолжаю получать NPE. Помощь

Код:

private static Date getNearestDate(List<Date> dates, Date currentDate) {
    long minDiff = -1, currentTime = currentDate.getTime();
    Date minDate = null;
    if (!dates.isEmpty() && currentDate != null) {
        for (Date date : dates) {
            long diff = Math.abs(currentTime - date.getTime());
            if ((minDiff == -1) || (diff < minDiff)) {
                minDiff = diff;
                minDate = date;
            }
        }
    }
    return minDate;
}

Я получаю исключение NullPointerException из строки 2 приведенного выше кода и использую следующий код для передачи thisDate в качестве переменной currentDate.

Date thisDate = null;
try {
    thisDate = (new SimpleDateFormat("MM/dd/yyyy")).parse(Calendar.getInstance().getTime().toString());
} catch (Exception e) {}

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Поскольку вы указали, что NullPointerException выдается в строке 2, мы можем сделать вывод, что вы передаете null для аргумента currentDate. currentDate.getTime() - единственная часть строки 2, которая может вызвать NullPointerException.

Обновление:

Я просто написал следующий Test.java код, чтобы понять, в чем ваша проблема:

import java.util.*;
import java.text.*;

class Test {
    public static void main(String[] args) {
        Date thisDate = null;
        try {
            thisDate = (new SimpleDateFormat("MM/dd/yyyy")).parse(Calendar.getInstance().getTime().toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Когда я запускаю его, я получаю:

java.text.ParseException: Unparseable date: "Sat Aug 20 12:42:30 PDT 2011"
    at java.text.DateFormat.parse(DateFormat.java:337)
    at Test.main(Test.java:8)

Итак, проблема в том, что ваш SimpleDateFormat.parse() ожидает формат месяца / дня / года, но метод toString() класса Date дает вам нечто иное.

Кажется, что все, что вы действительно хотите, это текущая дата. Зачем его форматировать? Просто обрежьте это до конца и покончите с этим:

Date thisDate = new Date(); // this gives you the current date
2 голосов
/ 20 августа 2011

Какая ваша линия:

thisDate = (new SimpleDateFormat("MM/dd/yyyy")).parse(Calendar.getInstance().getTime().toString());

делает это

  • создать новый объект Calender (инициализируется текущим временем),
  • получить от него объект Date (),
  • преобразовать это в строку, которая будет использовать формат по умолчанию, такой как "EEE MMM d HH: mm: ss z yyyy"
  • и попробуйте проанализировать результат как дату в формате "ММ / ДД / ГГГГ"
  • (который не будет проанализирован по проекту, в результате чего null)

Если вы исправите все проблемы в этой строке, конечным результатом будет объект Date, содержащий текущее время.

Намного проще получить такой Date:

thisDate = new Date();
...