Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Это - классическая проблема, и на самом деле легче при инвертировании логики.
Позволяют мне дать Вам пример.
я отправлю один промежуток времени здесь и все различные изменения других периодов то перекрытие в некотором роде.
|-------------------| compare to this one
|---------| contained within
|----------| contained within, equal start
|-----------| contained within, equal end
|-------------------| contained within, equal start+end
|------------| not fully contained, overlaps start
|---------------| not fully contained, overlaps end
|-------------------------| overlaps start, bigger
|-----------------------| overlaps end, bigger
|------------------------------| overlaps entire period
, с другой стороны, позвольте мне отправить все те, который не накладывается:
|-------------------| compare to this one
|---| ends before
|---| starts after
Поэтому, если Вы простой уменьшаете сравнение с:
starts after end
ends before start
тогда Вы найдете все теми, который не накладывается, и затем Вы найдете все периоды несоответствия.
Для Вашего финала НЕ В примере СПИСКА, Вы видите, что это соответствует тем двум правилам.
необходимо будет решить, являются ли следующие периоды В или ВНЕ диапазонов:
|-------------|
|-------| equal end with start of comparison period
|-----| equal start with end of comparison period
, Если Ваша таблица имеет столбцы, названные range_end и range_start, вот некоторый простой SQL для получения всех строк соответствия:
SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
OR range_end < @check_period_start)
Примечание НЕ там. Начиная с двух простых правил находит весь несоответствие строки, простое НЕ инвертирует его для высказывания: , если это не одна из строк несоответствия, это должен быть один из соответствия .
Применение простой логики реверсирования здесь для избавлений от НЕ и Вы закончите с:
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start
Взятие Вашего примера располагается от 06.06.1983 до 18.06.1983 и предположение, что у Вас есть столбцы, названные , запускаются и конец для Ваших диапазонов, Вы могли использовать пункт как это
where ('1983-06-06' <= end) and ('1983-06-18' >= start)
т.е. проверить, что запуск Вашего тестового диапазона перед концом диапазона базы данных, и что конец Вашего тестового диапазона после или на запуске диапазона базы данных.
Если Ваш RDBMS поддерживает ПЕРЕКРЫТИЕ () функция тогда, это становится тривиальным - никакая потребность в решениях собственной разработки. (В Oracle это, по-видимому, работает, но не документировано).
В Ваших ожидаемых результатах Вы говорите
06.06.1983 к 18.06.1983 = В СПИСКЕ
Однако, этот период не содержит, ни содержится любым из периодов в Вашей таблице (не, перечисляют!) периодов. Это действительно, однако, перекрывает период 06.10.1983 до 14.06.1983.
можно найти книгу Snodgrass ( http://www.cs.arizona.edu/people/rts/tdbbook.pdf ) полезный: это предшествует mysql, но понятие времени не изменилось;-)