Android App crasht mit NullPointerException

  • Java

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Murdock.

    Android App crasht mit NullPointerException

    Hi Leute,
    aktuell versuche ich mich selbst mal an einer Android-App mit Java. Vorab will ich sagen das Java nicht mein "Fachgebiet" ist und ich deshalb noch lerne. Ich arbeite aktuell an einer kleinen Chemie-App (für eigene Zwecke) und hab ein Problem. Mein Code sieht folgendermaßen aus:

    Java-Quellcode

    1. public void setElementName(String _elementName) {
    2. TextView elementName = (TextView) findViewById(R.id.elementName);
    3. elementName.setText(_elementName);
    4. }

    der Aufurf wird getätig mit setElementName("Radon");. Jedoch crasht die App und gibt mir folgenden Output:

    Quellcode

    1. 08-07 09:38:40.791 1988-1988/com.jan.theelements E/AndroidRuntime﹕ FATAL EXCEPTION: main
    2. java.lang.NullPointerException
    3. at com.jan.theelements.MainActivity.setElementName(MainActivity.java:81)
    4. at com.jan.theelements.MainActivity$1.onItemClick(MainActivity.java:45)
    5. at android.widget.AdapterView.performItemClick(AdapterView.java:298)
    6. at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
    7. at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
    8. at android.widget.AbsListView$1.run(AbsListView.java:3423)
    9. at android.os.Handler.handleCallback(Handler.java:725)
    10. at android.os.Handler.dispatchMessage(Handler.java:92)
    11. at android.os.Looper.loop(Looper.java:137)
    12. at android.app.ActivityThread.main(ActivityThread.java:5041)
    13. at java.lang.reflect.Method.invokeNative(Native Method)
    14. at java.lang.reflect.Method.invoke(Method.java:511)
    15. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    16. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    17. at dalvik.system.NativeStart.main(Native Method)

    Wie kann ich das fixen? Habe bereits einige Dinge über die NullPointerException gelesen aber habe das nicht so wirklich verstanden. Ich hab das woanders beispielsweise nicht:

    Java-Quellcode

    1. TextView mainErrorMessage = (TextView) findViewById(R.id.mainErrorMessage);
    2. mainErrorMessage.setText("Something bad happened.");

    Hoffe mir kann da einer aushelfen.

    Grüße
    Jan
    Software being "Done" is like lawn being "Mowed". (Jim Benson)

    KidRick schrieb:

    NullPointerException gelesen aber habe das nicht so wirklich verstanden


    Bedeutet das deine "TextView elementName" Null ist. R.Id's sind auch keine Strings, es sind numerische Werte vom Datentyp Integer.

    Teste das mal so:

    Java-Quellcode

    1. if(elementName == null){
    2. Toast.makeText(this, "txt = null", 2500).show();
    3. }


    So wird das funktionieren:

    Java-Quellcode

    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3. super.onCreate(savedInstanceState);
    4. setContentView(R.layout.activity_main);
    5. SetTheText(R.id.tv1, "Neuer String");
    6. }
    7. void SetTheText(int id, String val){
    8. TextView txt = (TextView)findViewById(id);
    9. txt.setText(val);
    10. }

    Mir ist bewusst das R.id's keine Strings sind, aber das ist ja auch die Logik hinter findViewById. Und das elementName null ist weiß ich auch, denn ich hab das mal gedebuggt. Jedoch versteh ich den Sinn dahinter nicht wirklich. Denn folgender Code

    Java-Quellcode

    1. TextView mainErrorMessage = (TextView) findViewById(R.id.mainErrorMessage);
    2. mainErrorMessage.setText("Something bad happened.");

    funktioniert einwandfrei. Ich werde deinen Lösungsvorschlag mal ausprobieren.

    EDIT: Wie bereits gedacht, selber Fehler bei deinem Lösungsvorschlag.
    Software being "Done" is like lawn being "Mowed". (Jim Benson)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KidRick“ ()

    Murdock schrieb:

    Ist die TextView auch auf der Activity/dem Fragment dieser Klasse?

    Ich schätze mal das wird das Problem sein^^ Die TextView ist Teil der ElementActivity.

    EDIT: Ok ich habs jetzt mal so versucht, jedoch gibt es die gleiche Exception

    Java-Quellcode

    1. package com.jan.theelements;
    2. import android.content.Intent;
    3. import android.renderscript.Element;
    4. import android.support.v7.app.AppCompatActivity;
    5. import android.os.Bundle;
    6. import android.view.Menu;
    7. import android.view.MenuItem;
    8. import android.view.View;
    9. import android.widget.AdapterView;
    10. import android.widget.ArrayAdapter;
    11. import android.widget.ListAdapter;
    12. import android.widget.ListView;
    13. import android.widget.TextView;
    14. public class MainActivity extends AppCompatActivity {
    15. @Override
    16. protected void onCreate(Bundle savedInstanceState) {
    17. super.onCreate(savedInstanceState);
    18. setContentView(R.layout.layout_index);
    19. initLayout();
    20. }
    21. public void initLayout() {
    22. String[] types = { getString(R.string.index_metal), getString(R.string.index_metalloid),
    23. getString(R.string.index_nonmetal), getString(R.string.index_otherunk) };
    24. ListAdapter list_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, types);
    25. ListView indexList = (ListView) findViewById(R.id.indexList);
    26. indexList.setAdapter(list_adapter);
    27. indexList.setOnItemClickListener(
    28. new AdapterView.OnItemClickListener() {
    29. @Override
    30. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    31. String selection = String.valueOf(parent.getItemAtPosition(position));
    32. ElementActivity e = new ElementActivity();
    33. if (selection == getString(R.string.index_metal)) {
    34. // Metal relevant code
    35. onMetalSelected();
    36. } else if (selection == getString(R.string.index_metalloid)) {
    37. // Metalloid relevant code
    38. onNonmetalSelected();
    39. } else if (selection == getString(R.string.index_nonmetal)) {
    40. // Nonmetal relevant code
    41. Intent elementIntent = new Intent(MainActivity.this, ElementActivity.class);
    42. MainActivity.this.startActivity(elementIntent);
    43. e.setElementName("Radon"); // hier gibts die exception
    44. e.setElementSymbol("Rn");
    45. } else if (selection == getString(R.string.index_otherunk)) {
    46. // Other/unknown relevant code
    47. // onOtherSelected();
    48. } else {
    49. // This should never happen.
    50. setContentView(R.layout.activity_main);
    51. TextView mainErrorMessage = (TextView) findViewById(R.id.mainErrorMessage);
    52. mainErrorMessage.setText("Something bad happened. Normally this part of code should never called. Please report the error with code ERR01!");
    53. }
    54. }
    55. }
    56. );
    57. }
    58. public void onMetalSelected() {
    59. setContentView(R.layout.layout_metal);
    60. String[] types = { getString(R.string.metal_alkali), getString(R.string.metal_alkalineearth),
    61. getString(R.string.metal_lanthanide), getString(R.string.metal_actinide),
    62. getString(R.string.metal_transition), getString(R.string.metal_postransition) };
    63. ListAdapter list_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, types);
    64. ListView metalList = (ListView) findViewById(R.id.metalList);
    65. metalList.setAdapter(list_adapter);
    66. }
    67. public void onNonmetalSelected() {
    68. setContentView(R.layout.layout_nonmetal);
    69. String[] types = { getString(R.string.nm_polyatomic), getString(R.string.nm_diatomic),
    70. getString(R.string.nm_noblegas) };
    71. ListAdapter list_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, types);
    72. ListView nonmetalList = (ListView) findViewById(R.id.nonmetalList);
    73. nonmetalList.setAdapter(list_adapter);
    74. }
    75. @Override
    76. public boolean onCreateOptionsMenu(Menu menu) {
    77. getMenuInflater().inflate(R.menu.simple_menu, menu);
    78. return true;
    79. }
    80. @Override
    81. public boolean onOptionsItemSelected(MenuItem item) {
    82. int id = item.getItemId();
    83. if (id == R.id.action_about) {
    84. Intent aboutIntent = new Intent(MainActivity.this, AboutActivity.class);
    85. MainActivity.this.startActivity(aboutIntent);
    86. } else if (id == R.id.action_gtindex) {
    87. setContentView(R.layout.layout_index);
    88. initLayout();
    89. } else {
    90. setContentView(R.layout.activity_main);
    91. TextView mainErrorMessage = (TextView) findViewById(R.id.mainErrorMessage);
    92. mainErrorMessage.setText("Something bad happened. Normally this part of code should never called. Please report the error with code ERR02!");
    93. }
    94. return super.onOptionsItemSelected(item);
    95. }
    96. }

    Software being "Done" is like lawn being "Mowed". (Jim Benson)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „KidRick“ ()

    Schau dir mal die Zeilen 36 und 45 bis 48 an. Du hast e als ElementActivity deklariert, wird aber nie gestartet. In 45 hast du dann elementIntent, diese Activity startest du, also läuft e nicht und daher wohl die Exception. Ausserdem würde ich den String der angezeigt werden soll als Extra oder Bundle mitgeben, der Lebenszyklus der Activities könnte dir auch zum Problem werden.

    Vielleicht kannst du damit was anfangen, überhaupt gibt es auf der Seite gute Anleitungen rundum Android.

    vogella.com/tutorials/AndroidIntent/article.html
    vogella.com/tutorials/AndroidLifeCycle/article.html

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Murdock“ ()