Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8013086

NPE thrown by SimpleDateFormat with TimeZoneNameProvider supplied

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • P3
    • 8
    • 7, 8
    • core-libs
    • None
    • b91
    • generic
    • generic

    Description

      FULL PRODUCT VERSION :
      java version " 1.7.0_07 "
      Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
      Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Not OS dependent.

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      -Djava.ext.dirs=<path>, where <path> includes a custom TimeZoneNameProvider implementation available.

      A DESCRIPTION OF THE PROBLEM :
      A user can subclass java.util.spi.TimeZoneNameProvider to create a custom time zone name provider implementation. When the method " public String getDisplayName(String ID, boolean daylight, int style, Locale locale) " in a custom provider only support partial combination of daylight/style (for example, an implementation support long and short standard display names, but not daylight saving time names), then SimpleDateFormat#parse method could throw NPE like below -

      ----
      java.lang.NullPointerException
      at java.text.SimpleDateFormat.matchZoneString(SimpleDateFormat.java:1566)
      at java.text.SimpleDateFormat.subParseZoneString(SimpleDateFormat.java:1628)
      at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2017)
      at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
      at java.text.DateFormat.parse(DateFormat.java:355)
      ----

      The problem is caused by sun.util.TimeZoneNameUtility#buildZoneStrings(TimeZoneNameProvider tznp, Locale locale, String id) loading display name array with some entries with null value when a custom TimeZoneNameProvider is provided and the provider returns non-null value for long standard name, but null for any of other combinations. buildZoneStrings() only checks if names[1] is not null, that is, long standard name. However, SimpleDateFormat#matchZoneString() expects the name array is fully filled with non-null names.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      See http://bugs.icu-project.org/trac/ticket/9400

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      When time zone names are loaded into zoneStrings array, each name should be initialized independently. That is, if a custom TimeZoneNameProvider's getDisplayName returns partial set of names for a zone ID, names not supported by the provider should be initialized by Java's own fallback implementation.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      Attachments

        Activity

          People

            naoto Naoto Sato
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: