0

Краткого описания о том, что я пытаюсь сделать:Указатель NULL, когда активность начинается без намерения. «INT java.lang.String.hashCode()» на нулевой ссылке на объект

  1. Это простое приложение для обмена сообщений

  2. В моей первой деятельности У меня есть список и несколько кнопок.

    • Пользователь нажимает любую из кнопок, а информация о том, какая кнопка была нажата, хранилась в общих настройках.
    • Когда пользователь нажимает на любой элемент списка, запускается намерение, которое приводит его к новому действию, в котором был нажат элемент списка, с помощью putExtra() из намерения.
  3. Во второй деятельности, в зависимости от того, какое значение пришли с намерением, строковое значение для NewString решается.

Проблема Когда экран вращается, приложение падает с этой ошибкой -

попытка вызвать виртуальный метод 'INT java.lang.String.hashCode()' на null ссылка на объект

Ниже приведен код второй деятельности -

String newString = "Default_Channel"; 

public static final String MyPREFERENCES = "MyPrefs" ; 
SharedPreferences sharedpreferences; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_chat2); 

    . 
    . 
    . 

    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 

    String restoredText = sharedpreferences.getString("CurrentUser", null); 
    if (restoredText != null) { 
     currentUserName = sharedpreferences.getString("CurrentUser", "unknown");//"unknown" is the default value. 
     . 
     . 
     . 
    } 
    else 
    { 
     currentUser.setText("not signed in"); 
    } 


    if (savedInstanceState == null) 
    { 
     Bundle extras = getIntent().getExtras(); 
     if(extras == null) 
     { 
      newString= "Default_Channel"; 
     } 
     else 
     { 
      newString= extras.getString("LIST_ITEM_CLICKED"); 
     } 
    } 
    else 
    { 
     newString= (String) savedInstanceState.getSerializable("LIST_ITEM_CLICKED"); 
    } 
    // *** GETTING ERROR HERE On this line *** // 

    switch (newString) 
    { 
     case "User_1": 
      . 
      . 
      . 
      break; 
     case "User_2": 
      . 
      . 
      . 
      break; 
     case "User_3": 
      . 
      . 
      . 
      break; 
     case "Default_Channel": 
      . 
      . 
      . 
      break; 
    } 

Я получаю исключение NULL pointer, где я упомянул его в коде! Его строка между выражением Else и коммутатором.

Кроме того, я понимаю, что такое исключение NULL-указателя, и это не то, что я прошу. Я получаю NULL-указатель, когда экран вращается, т. Е. Когда активность перезапускается без намерения.

Я новичок в программировании на Android и не в состоянии понять, что здесь происходит.

Редактировать: Это не дублирующий вопрос: «Что такое исключение указателя NULL».

+1

Спасибо! Я ценю, что вы публикуете ссылку.Но я уже посмотрел на него, и это не то, что я ищу. Я знаю, что такое исключение Null-указателя. Я пытаюсь выяснить, что вызывает его «после вращения экрана». – Nis

ответ

2

Я вижу, вы используете это:

newString= (String) savedInstanceState.getSerializable("LIST_ITEM_CLICKED"); 

Так что вы переопределить onSaveInstanceState?
Если нет, переопределите его и сохраните текущее значение "LIST_ITEM_CLICKED".

Я думаю, что ваша проблема в том, что при повороте активность воссоздается с сохраненнымInstanceState, но вы не сохраняете свое значение, поэтому происходит NPE.

+0

Да! Вы получили это правильно :) Большое спасибо! Я не переопределял onSaveInstanceState, это вызывало ошибку и сбой. – Nis

0

В основном вы получаете NullPointerException. Код, который вы опубликовали, неясно, где именно вы получаете это. Вам нужно проверить, является ли объект, на котором выполняется операция, нулевым или нет, и действуйте на основе этого. См What is a NullPointerException, and how do I fix it?