2016-07-29 19 views
0

Ich versuche, eine einfache Anwendung zu starten, die beim Klicken auf eine Schaltfläche (StartButton) eine Mix() -Methode startet, die ein zufällig ausgewähltes Wort aus einem String-Array (wordPick) scrambelt und den Text von a setzt Textfeld (ScambleF) zu ihm. Von dort liest ein weiterer Knopf (EnterButton) aus einem editierbaren Textfeld (EnterF) und prüft, ob das vom Benutzer eingegebene Wort im Textfeld EnterF mit dem Wort unverschlüsselt übereinstimmt.Die App kann nicht in Android Studio ausgeführt werden. NullPointerException

Leider bekomme ich sofort den folgenden Fehler beim Starten der App in meinem Emulator. Ich habe hier nach einer Antwort gesucht, aber bis jetzt ist das einzige, was geholfen hat, meine Variablen vor onCreate() nicht zu initialisieren.

EDIT: Es ist ein Chronometer hinzugefügt, aber im Moment hat es keine Funktionalität.

FATAL EXCEPTION: main 
 
Process: com.example.roland.scramblegame, PID: 19156 
 

 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.roland.scramblegame/com.example.roland.scramblegame.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
 
at android.os.Handler.dispatchMessage(Handler.java:102) 
 
at android.os.Looper.loop(Looper.java:148) 
 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
 
at java.lang.reflect.Method.invoke(Native Method) 
 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
 
at android.content.ContextWrapper.getResources(ContextWrapper.java:87) 
 
at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81) 
 
at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:541) 
 
at android.content.Context.getString(Context.java:409) 
 
at com.example.roland.scramblegame.MainActivity.Fill(MainActivity.java:64) 
 
at com.example.roland.scramblegame.MainActivity.onCreate(MainActivity.java:27) 
 
at android.app.Activity.performCreate(Activity.java:6237) 
 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
 
at android.app.ActivityThread.-wrap11(ActivityThread.java)  
 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
 
at android.os.Handler.dispatchMessage(Handler.java:102)  
 
at android.os.Looper.loop(Looper.java:148)  
 
at android.app.ActivityThread.main(ActivityThread.java:5417)  
 
at java.lang.reflect.Method.invoke(Native Method)  
 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Hier ist meine Java-Datei

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import java.util.Random; 
public class MainActivity extends AppCompatActivity { 

String []wordPick; 
int track; 
Button StartButton, EnterButton; 
TextView ScrambleF; 
EditText EnterF; 
MainActivity run; 

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

    run = new MainActivity(); 
    wordPick = new String[16]; 
    wordPick = run.Fill(wordPick); 
    StartButton = (Button)findViewById(R.id.StartB); 
    EnterButton = (Button)findViewById(R.id.EnterB); 

    StartButton.setOnClickListener(
      new Button.OnClickListener() { 
       public void onClick(View v) { 
        Random rand = new Random(); 
        track = rand.nextInt(16); 
        ScrambleF = (TextView)findViewById(R.id.Question); 
        ScrambleF.setText(run.Mix(wordPick[track])); 
       } 
      } 
    ); 

    EnterButton.setOnClickListener(
      new Button.OnClickListener() { 
       public void onClick(View v) { 
        EnterF = (EditText) findViewById(R.id.Answer); 
        if (EnterF.getText().toString().equalsIgnoreCase(wordPick[track])) { 
         //Correct 
        } 
        else { 
         //Incorrect 
        } 
       } 
      } 
    ); 
} 


public String[] Fill (String[] array) { 
    //Im just going to add random words 
    if (array == null) { 
     array = wordPick; 
    } 
    array[0] = getString(R.string.W_Bottle); 
    array[1] = getString(R.string.W_Samurai); 
    array[2] = getString(R.string.W_Keyboard); 
    array[3] = getString(R.string.W_Shrimp); 
    array[4] = getString(R.string.W_Project); 
    array[5] = getString(R.string.W_Planet); 
    array[6] = getString(R.string.W_Walnut); 
    array[7] = getString(R.string.W_PacMan); 
    array[8] = getString(R.string.W_Shelter); 
    array[9] = getString(R.string.W_Android); 
    array[10] = getString(R.string.W_Toilet); 
    array[11] = getString(R.string.W_Numbers); 
    array[12] = getString(R.string.W_Anime); 
    array[13] = getString(R.string.W_Goldfish); 
    array[14] = getString(R.string.W_Phantom); 
    array[15] = getString(R.string.W_Jigsaw); 

    return array; 
} 

public String Mix (String str) { 
    //This scrambles up the words in the string array 
    if(str == null) { 
     str = wordPick[track]; 
    } 
    char[] characters = str.toCharArray(); 
    for (int i = 0; i < characters.length; i++) { 
     int randomIndex = (int)(Math.random() * characters.length); 
     char temp = characters[i]; 
     characters[i] = characters[randomIndex]; 
     characters[randomIndex] = temp; 
    } 

    str = String.valueOf(characters); 
    return str; 
} 
} 

Das Manifest

<?xml version="1.0" encoding="utf-8"?> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Und benötigt, wenn ich nur die activity_main.xml hier verlassen denken zu

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 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" 
tools:context="com.example.roland.scramblegame.MainActivity" 
android:background="#006699"> 

<Chronometer 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/chronometer" 
    android:textSize="25sp" 
    android:textStyle="bold" 
    android:textColor="#ffffff" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="SCRAMBLED WORD" 
    android:id="@+id/Question" 
    android:enabled="false" 
    android:textSize="30sp" 
    android:textStyle="bold" 
    android:textColor="#FFFFFF" 
    android:background="#427030" 
    android:padding="5dp" 
    android:layout_above="@+id/Answer" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="70dp" /> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/Answer" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" 
    android:width="250dp" 
    android:background="#dddddd" 
    android:height="45dp" 
    android:clickable="false" 
    android:singleLine="true" 
    android:minHeight="35dp" 
    android:inputType="text" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/StartButton" 
    android:id="@+id/StartB" 
    android:layout_below="@+id/Answer" 
    android:layout_alignStart="@+id/Answer" 
    android:layout_marginTop="43dp" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/EnterButton" 
    android:id="@+id/EnterB" 
    android:layout_alignTop="@+id/StartB" 
    android:layout_alignEnd="@+id/Answer" /> 

</RelativeLayout> 
+0

Sie können eine 'Activity' nicht mit' new' instanziieren und lassen sie korrekt arbeiten. Warum versuchst du das überhaupt? Rufen Sie einfach Ihre 'Fill()' Methode direkt in 'onCreate()' auf. Außerdem sollten Sie den Java-Namenskonventionen folgen und die Methodennamen mit Kleinbuchstaben beginnen. –

+0

Mögliches Duplikat von [Was ist eine NullPointerException und wie behebe ich sie?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+1

"Sie können eine Aktivität nicht mit neuen Instanzen instantiieren und lassen sie richtig funktionieren. Warum versuchen Sie das trotzdem? Rufen Sie einfach Ihre Fill() Methode direkt in onCreate() auf." Wow, ich habe das 'neue' los und alles funktioniert jetzt, ich bin nur ein totaler Anfänger, wenn es um das Codieren geht, also mache ich dumme kleine Fehler so. Vielen Dank!! – THEROFLBOAT

Antwort

1

ich den Fehler vielleicht aus dem Code unten kommen in Ihnen onCreate:

run = new MainActivity(); 
wordPick = new String[16]; 
wordPick = run.Fill(wordPick); 

Sind Sind Sie sicher, dass Sie eine Aktivität von new Activity() erstellen müssen? Es ist ein bisschen seltsam und nicht zu empfehlen.

versuchen, die drei Zeilen zu ersetzen:

wordPick = Fill(new String[16]); 

Vielleicht kann dabei helfen.

+0

Nein ... Eine neue Aktivität muss nie erstellt werden. Es wird zu diesem Zeitpunkt vom Betriebssystem nicht verwaltet –

1

Initialisieren Sie einfach keine neue MainActivity-Variable. Dies ist nicht notwendig und scheint der Grund für den Absturz Ihrer App zu sein.

Verwandte Themen