Инициализируйте ваши кнопки в другом месте, как в onCreate
.
Проблема заключается в состоянии this
(A3Activity
), когда экземпляры Button
создаются в переменной экземпляраинициализаторы (closeAddEventButton
и submitAddEventButton
).
Инициализаторы переменных экземпляра выполняются перед конструкторами, но объект не полностью инициализируется, пока не будут выполнены его конструктор (ы).Объекты, на которые есть ссылки до этого, будут в неопределенном состоянии.
(Состояние может быть определено; я просто имею в виду, что экземпляр еще не может быть использован полностью).
Что-то в потоке инициализации Button
использует неинициализированное значение из A3Activity
и выдает NPE
.( JLS 12.5: создание новых экземпляров класса подробно описывает процесс инициализации экземпляра.)
Принимая во внимание, что инициализаторы работают в текстовом порядке ( JLS 12.4.2 ), перед конструкторами,Вот простая демонстрация:
public class ThisHere {
public String aww;
public String notYet = this.aww;
GedankenExperiment wat = new GedankenExperiment(this);
// public class GedankenExperiment {
// public GedankenExperiment(thatThere) {
// thatThere.aww = ???
// }
// }
public ThisHere() {
this.aww = "Hi there";
}
public static void main(String[] args) {
ThisHere thisHere = new ThisHere();
System.out.println("aww=" + thisHere.aww);
// > aww=Hi there (initialized in ctor)
System.out.println("notYet=" + thisHere.notYet);
// > notYet=null (initialized before ctor)
}
}
К вашему сведению, контрольным знаком была эта строка журнала:
at A3.cal.A3Activity.<init>(A3Activity.java:32)
Это единственная строка журнала, которую я действительно видел, потому что мойПервым шагом был поиск ссылки на что-либо, кроме пакетов Android и Java.Часть <init>
означает, что его нет в методе, поэтому он имеет отношение к инициализаторам экземпляра.
Трассировка стека включает Button
записей инициализатора.Это плюс использование this
в их конструкторах означало, что это была единственная реальная возможность, следовательно, быстрый поворот без особых копаний.