ExceptionInInitializerError - статические конечные переменные - PullRequest
0 голосов
/ 04 мая 2018

Следующий код иногда выдает ExceptionInInitializerError. Очевидно, статическая переменная res равна null, хотя она используется после того, как должна была быть инициализирована. В чем может быть причина?

public class GameActivity extends Activity {
    private static final Resources res = App.getAppContext().getResources();
    public static final String foo = res.getString(R.string.foo); //NullPointer here
}

public class App extends Application {
    private static Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }   
    public static Context getAppContext() {
        return context;
    }
}

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Сначала объявляйте переменные, затем после получения значения в onCreate () вы пропустили метод onCreate ().

 public class GameActivity extends Activity {
        Context context;
 private static Resources res;
    public static String foo;

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_address);
            context = this;
            init();
        }

        private void init() {
            res = App.getAppContext().getResources();
            foo = res.getString(R.string.foo); //NullPointer here
        }

        public class App extends Application {
            private static Context context;

            public void onCreate() {
                super.onCreate();
                context = getApplicationContext();
            }

            public static Context getAppContext() {
                return context;
            }
        }
    }

Непосредственно вы можете получить отрывок строки из string.xml файла, подобного этому

public class GameActivity extends Activity {
    Context context;
    public String foo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_address);
        context = this;
        init();
    }

    private void init() {
        foo = getString(R.string.foo);
    }
}
0 голосов
/ 04 мая 2018

Вместо использования res = App.getAppContext().getResources() просто позвоните res = getApplicationContext().getResources().

0 голосов
/ 04 мая 2018

Вы не можете получить доступ к ресурсам до инициализации приложения. static поля генерируются в .dex файле со статическим определением, это означает, что они должны быть статическими, как "foo". Но вы не можете использовать ресурсы при статической инициализации с ресурсами приложения.

Измените свой класс деятельности этим.

public class GameActivity extends Activity {
    private static Resources res;
    public static String foo;

    @Override
    protected void onCreate(@android.support.annotation.Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        res = App.getAppContext().getResources();
        foo = res.getString(R.string.foo);
    }
}

Кстати, зачем вам нужно создавать объект Resources, когда у вас есть прямой доступ к методу getString в Activity class

Вы можете просто сделать это.

public class GameActivity extends Activity {
    public static String foo;

    @Override
    protected void onCreate(@android.support.annotation.Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        foo = getString(R.string.foo);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...