2016-07-23 2 views
-1

У меня есть код, который при запуске возвращает ошибку с нулевым указателем. Это код и ошибка из LogCat:Не удается исправить ошибку Java null pointer

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.content.res.Resources; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Button; 
import java.lang.String; 
import java.util.Random; 


public class MainActivity extends AppCompatActivity { 

    private static final Random r_generator = new Random(); 
    String textViewString; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Resources res = getResources(); 
     String[] myString = res.getStringArray(R.array.colorArray); 
     String q = myString[r_generator.nextInt(myString.length)]; 
     TextView tv = (TextView) findViewById(R.id.color_text); 
     tv.setText(q); 

    Button green= (Button) findViewById(R.id.green_button); 
    green.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Green")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 
     } 
    }); 

    Button blue = (Button) findViewById(R.id.blue_button); 
    blue.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Blue")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 
     } 
    }); 

    Button red = (Button) findViewById(R.id.red_button); 
    red.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Red")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 

     } 
    } 

Я пытался смотреть на других незаконных государственные вопросах об ошибках, но я все еще потерян на том, что происходит не так с моим каждым конкретным случаем.

Это код ошибки:

E/AndroidRuntime: FATAL EXCEPTION: main 
                         java.lang.NullPointerException 
                          at com.example.cedric.learnthecolors.MainActivity$1.onClick(MainActivity.java:31) 
                          at android.view.View.performClick(View.java:4476) 
                          at android.view.View$PerformClick.run(View.java:18795) 
                          at android.os.Handler.handleCallback(Handler.java:730) 
                          at android.os.Handler.dispatchMessage(Handler.java:92) 
                          at android.os.Looper.loop(Looper.java:177) 
                          at android.app.ActivityThread.main(ActivityThread.java:5496) 
                          at java.lang.reflect.Method.invokeNative(Native Method) 
                          at java.lang.reflect.Method.invoke(Method.java:525) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041) 
                          at dalvik.system.NativeStart.main(Native Method) 

Это мой файл макета:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:theme="@android:style/Theme.Holo.Light" 
    tools:context="com.example.cedric.learnthecolors.MainActivity" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:id="@+id/color_text" 
      android:text="@string/Green" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:textSize="68sp" 
      android:gravity="center" 
      android:textAllCaps="true"/> 

    </LinearLayout> 

    <LinearLayout android:id="@+id/linearLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/green_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/green_button"/> 

     <Button 
      android:id="@+id/blue_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/blue_button"/> 

     <Button 
      android:id="@+id/red_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/the_red_button"/> 

    </LinearLayout> 

    <LinearLayout android:id="@+id/linearLayout2" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/yellow_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/yellow_button"/> 

     <Button 
      android:id="@+id/white_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/white_button"/> 

     <Button 
      android:id="@+id/orange_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/orange_button"/> 

    </LinearLayout> 

    <LinearLayout android:id="@+id/linearLayout3" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="horizontal"> 

     <Button 
      android:id="@+id/brown_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/brown_button"/> 

     <Button 
      android:id="@+id/pink_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/pink_button"/> 

     <Button 
      android:id="@+id/purple_button" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:onClick="onClick" 
      android:background="@drawable/purple_button"/> 

    </LinearLayout> 

</LinearLayout> 

спасибо !!!

+0

К сожалению, я новичок в Java (это мой первый день), и я не понимал большую часть языка в предыдущем сообщении, например «ссылочный тип», «примитивное значение», «разыменование». Если бы я мог получить конкретный ответ, я думаю, что смогу научиться на примере и уметь самостоятельно прояснить будущие ошибки. – Franco

+0

'if (! TextViewString.equals (" Red ")) return;' Я не понимаю эту строку. Другое дело, вы устанавливаете 'onClickListener' дважды для синей кнопки, а не один раз для красного. Вероятно, ошибка копирования-вставки. – Vucko

+0

, в какой строке происходит ошибка? – Roland

ответ

0

Попробуйте изменить тему и проверить, не работает ли она.

android:theme="@android:style/Theme.Holo.Light" 
+0

Спасибо, но это не сработает. – Franco

1

Вы не устанавливая onClickListener для красной кнопки, вы переназначение слушателя синей кнопки.

Button red = (Button) findViewById(R.id.red_button); 
blue.setOnClickListener(new View.OnClickListener() { 

Вы также определили свойство onClick в файле макета xml? Если это так, вам нужно убедиться, что у вас есть метод, соответствующий указанному вами имени. Например, если вы ввели

onClick="buttonClicked" 

Вам нужно определить метод называется

public void buttonClicked() { /* OnClick functionality here */ } 

См: @https://stackoverflow.com/a/38547338/1540698 от @vucko для вашего второго вопроса.

+0

Это не так ... – Vucko

+0

Откуда вы знаете @Vucko? Можете ли вы объяснить, как это может не быть проблемой, учитывая отсутствие информации с плаката? –

+0

Рассматривая скорректированную информацию от пользователя, похоже, что это может быть проблемой, поскольку плакат назначает слушателю onClick через xml, а затем повторно назначает один через код. Поскольку код для красной кнопки не назначался, это оставило мертвый вызов метода в onClick в XML. –

2

Проблема эта линия:

!textViewString.equals() 

Потому что вы не дали значения в textViewString где-нибудь, прежде чем использовать его. Присвойте ему пустую строку, по крайней мере, или просто удалите эту строку, поскольку на данный момент это не делает вам много хорошего, я действительно не понимаю. Поскольку вы нигде не меняете его значение, ни одна из ваших кнопок не будет работать (даже без исключения).

0

в макете, вы говорите:

android:onClick="onClick" 

Похоже, что вы не включили весь код для деятельности, но я бы держать пари, что он не определяет метод, названный onClick

Все, что вам нужно сделать, это определить метод.