2014-01-03 2 views
0

Проблема с преобразованием строки в объект DateDime Joda. Я не могу понять, что я делаю неправильно. Я следую инструкциям по другим темам здесь, в StackOverflow, но следующий код не работает. Это исключает это исключение:Проблема с преобразованием строки в объект DateDime Joda

Exception in thread "main" java.lang.NullPointerException 
    at org.joda.time.format.DateTimeFormatterBuilder$NumberFormatter.parseInto(DateTimeFormatterBuilder.java:1330) 
    at org.joda.time.format.DateTimeFormatterBuilder$Composite.parseInto(DateTimeFormatterBuilder.java:2741) 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:853) 
    at co.restclient.ExpiringCookie.<init>(ExpiringCookie.java:41) 
    at co.restclient.ExpiringCookie.main(ExpiringCookie.java:29) 

И вот код.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Properties; 

import org.joda.time.DateTime; 
import org.joda.time.Duration; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

/* 
* This class stores a cookie value and can tell when its expired by its timestamp 
*/ 
public class ExpiringCookie { 

    public static DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/YYYY HH:mm:ss"); 
    public static File cookieJar = new File("cookie.xml"); 
    public String singleCookie; 
    DateTime startTime; 
    DateTime currentTime; 
    boolean isExpired = false; 

    public static void main(String[] args) { 
     ExpiringCookie ec = new ExpiringCookie("xxxxxxx"); 
     System.out.println("Age of cookie: " + ec.timePassed().getMillis()); 
    } 

    public ExpiringCookie(String cookie) { 
     currentTime = new DateTime(); 
     Properties properties = new Properties(); 
     if (cookieJar.exists()) { 
      try { 
       properties.load(new FileInputStream(cookieJar));     
       new DateTime(); 
       //startTime = DateTime.parse(properties.getProperty("startTime"), DateTimeFormat.forPattern("dd/MM/YYYY HH:mm:ss")); 
       startTime = fmt.parseDateTime(properties.getProperty("startTime")); 
       singleCookie = properties.getProperty("cookie"); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } else {    
      properties.setProperty("startTime", fmt.print(currentTime)); 
      properties.setProperty("cookie", cookie); 
      startTime = new DateTime(currentTime.plusSeconds(-1)); 
      try { 
       properties.storeToXML(new FileOutputStream(cookieJar), "Stores cookie for API requests"); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public Duration timePassed() {  
     return new Duration(startTime, currentTime); 
    } 

    public boolean isExpired() { 
     return isExpired; 
    } 

} 

cookie.xml содержимое файла заключается в следующем:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
<comment>Stores cookie for API requests</comment> 
<entry key="cookie">xxxxxxx</entry> 
<entry key="startTime">03/01/2014 10:00:08</entry> 
</properties> 
+1

, что является результатом properties.getProperty («STARTTIME») и какую версию времени Joda вы используете? – pogopaule

+0

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с команда, предлагающая перейти на классы [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). См. [Учебное пособие по Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

ответ

3

Выражение properties.getProperty("startTime") в строке 41, кажется, возвращает null.

Проверьте JavaDoc для Properties#getProperty

Это говорит

запросы для свойства с указанным ключом в этом списке свойств. Если ключ не найден в этом списке свойств, тогда проверяется список свойств по умолчанию и его значения по умолчанию, рекурсивно. Метод возвращает null, если свойство не найдено.

Так что, кажется, нет никакого значения для ключа startTime в файле data/cookie.xml

я предполагаю, что вы используете последнюю Joda времени версии 2.3. In line 1330text.length() получает вызов. Если, как я полагаю выше, properties.getProperty("startTime") возвращает null, вы получаете NPE.

Решение: Убедитесь, что значение для ключа startTime в файле data/cookie.xml

+0

Я просто использую обычные свойства в/из методов xml. Разве они не должны быть надежными? Если вы запустите программу, указанную выше, я не вижу, где бы я мог сделать такую ​​ошибку. – djangofan

+0

Каково значение startTime в файле данных/cookie.xml? Ты проверил? – pogopaule

+0

Я отредактирую свой вопрос, чтобы показать входной файл xml. – djangofan

1

Выражение

DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/YYYY HH:mm:ss"); 
fmt.parseDateTime(null); 

производит NPE, увидеть этот похожий трассировку стека:

Exception in thread "main" java.lang.NullPointerException 
    at org.joda.time.format.DateTimeFormatterBuilder$NumberFormatter.parseIntoDateTimeFormatterBuilder.java:1292) 
    at org.joda.time.format.DateTimeFormatterBuilder$Composite.parseInto(DateTimeFormatterBuilder.java:2695) 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:846) 
    at time.JodaTest8.main(JodaTest8.java:80) 

И javadoc s ays, что аргумент не должен быть нулевым.

Общее замечание: Очень плохо, что вы просто создаете файловые потоки, не закрывая их после использования. Возможно, это причина вашей проблемы. Файл, возможно, уже был создан в прошлом запуске, но еще не закончен/покрашен/закрыт. И затем вы запрашиваете значения свойств в этом файле, NPE тогда легко возможен! Поэтому, пожалуйста, исправьте проблему с потоком.

+0

Ваше право. properties.getProperty() вытаскивает нулевое значение из файла свойств, который он сам написал. Я не вижу, как это возможно. – djangofan

+0

@djangofan Я добавил возможный сценарий, почему в вашем тесте cookie не было собственности.И старайтесь быть последовательными, 'storeToXML()' должен быть сопряжен с 'loadFromXML()', а не 'load()'. –

Смежные вопросы