Как IllegalArgumentException автоматически обрабатывается внутри условия «если» - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел обновить lastModifiedDate до текущей даты и выполнить какое-то действие, только если текущая дата больше, чем lastModifiedDate.

Но меня беспокоило получение исключения NullPointerException вблизи "dateToday.isAfter(lastModifiedDate.get("lastUpdated"))" внутри условия if, когда выполняется в первый раз, потому что нет пары ключ-значение для ключа "lastUpdated", пока в HashMap.Ниже приведен код.

import java.util.HashMap;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;

public class TestDate {

    static HashMap<String, LocalDate> lastModifiedDate = new HashMap<>();
    static int unityResponsesCount;

    public void resetUnityResponsesCount() {
        unityResponsesCount = 0;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        LocalDate dateToday = LocalDate.now(DateTimeZone.getDefault());

        if (lastModifiedDate.isEmpty() || dateToday.isAfter(lastModifiedDate.get("lastUpdated"))) {
            lastModifiedDate.put("lastUpdated", dateToday);
            TestDate testDate = new TestDate();
            testDate.resetUnityResponsesCount();
        }
    }

}

Перед запуском я отлаживал код, и когда я проверял только "dateToday.isAfter(lastModifiedDate.get("lastUpdated"))", я получал

java.lang.IllegalArgumentException:Частичное не может быть нулевым в org.joda.time.base.AbstractPartial.isAfter (AbstractPartial.java:351) в org.theorem.scan.qa.util.TestDate.main (TestDate.java:25)

Но если я проверю полное утверждение if, lastModifiedDate.isEmpty() || dateToday.isAfter(lastModifiedDate.get("lastUpdated")), я получу "ИСТИНА" .Если этот оператор IF дал исключение, я должен был предоставить отдельные условия с одним и тем же присваиванием внутри каждого из них, lastModifiedDate.put("lastUpdated", dateToday);.

Я просто удивлен, как IllegalArgumentException автоматически обрабатывается внутри условия if.

1 Ответ

1 голос
/ 03 апреля 2019

это состояние

(lastModifiedDate.isEmpty() || dateToday.isAfter(lastModifiedDate.get("lastUpdated")))

использует оператор ИЛИ короткого замыкания ||.

Это означает, что lastModifiedDate.isEmpty() вычисляется первым, а если оно истинно, dateToday.isAfter(lastModifiedDate.get("lastUpdated")) оценивается , а не , поэтому исключение не выдается. Все выражение считается истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...