Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Как правило, время Джоды позаботится о DST, поэтому вам не придется беспокоиться об этом. Тем не менее, я замечаю, что вы передаете null
в getOffset (). Учитывая, что смещение часового пояса зависит от даты, вам действительно нужно передать дату / время, когда вы вычисляете смещение, или вы получите неправильные результаты.
Также, как упоминалось в моем Предыдущий комментарий: Имейте в виду, что некоторые часовые пояса имеют смещение, которое не является целым числом часов. Например, Индия находится в GMT +5: 30
Часовые пояса и переход на летнее время - это кошмар. Вы, конечно, не должны сами решать эту задачу. Пусть Joda-Time делает тяжелый подъем.
См. этот ответ на аналогичный вопрос, Используя время Джоды, чтобы получить смещение UTC для заданной даты и часовой пояс , Класс DateTimeZone предлагает метод getOffset () .
Пример исходного кода в Joda-Time 2.3 в Java 7 ...
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");
org.joda.time.DateTime now = new org.joda.time.DateTime(californiaTimeZone);
int millisecondOffsetToAddToUtcToGetLocalTime = californiaTimeZone.getOffset( now );
System.out.println( "millisecondOffsetToAddToUtcToGetLocalTime: " + millisecondOffsetToAddToUtcToGetLocalTime );
// Note the casting to doubles to avoid integer truncation. Time zone offsets are NOT always whole hours.
System.out.println( "Offset in decimal hours: " + (double)millisecondOffsetToAddToUtcToGetLocalTime / 1000d / 60d / 60d );
При запуске в 2013-11-20T01: 03: 56.464-08: 00 ...
millisecondOffsetToAddToUtcToGetLocalTime: -28800000
millisecondOffsetToAddToUtcToGetLocalTime in hours: -8.0
ВАЖНО Этот формат номера -8.0
неверен для смещения. Должно быть либо:
-08:00
с двоеточием и двузначными цифрами (с добавлением начального нуля). -08
с начальным нулем. Да, все в порядке. Чтобы убедиться, что это правильно - вместо передачи null в объекте DateTime
в DateTimeZone.getOffset
- установите дату и время на лету, когда вы знаете, что действует DST - вы должны увидеть изменение значения смещения.