NullPointerException

  • 6 Antworten
  • Neuester Beitrag
Diskutiere NullPointerException im Android App Entwicklung im Bereich Betriebssysteme & Apps.
Micka

Micka

Fortgeschrittenes Mitglied
Hy,

ich mal wieder. Einige kennen mich evtl aus den vorherigen Threads zu Problemen mit meiner App.

Das neuste Problem tritt nun beim ändern eines Eintrags auf.
Um Eine Änderung zu realisieren hole ich mir aus der Datenbank die betreffenden Daten.

Nun möchte ich in meiner Eingabemaske die bisherigen Daten in die views laden.

Meine Eingabe Maske sieht wie folgt aus:

Spinner Spinner Spinner
TextView: EditText
TextView: EditText

oder eben in XML:
Code:
<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" 
>
    <!--     Datum -->
    <TableRow>
        <Spinner
            android:id="@+id/aendern_datum_Tag"
            android:layout_width="fill_parent"
               android:layout_height="wrap_content"
            android:drawSelectorOnTop="true" 
            android:entries="@array/tag_anzeige"
            android:entryValues="@array/tag_wert"
        />
        <Spinner
            android:id="@+id/aendern_datum_Monat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:drawSelectorOnTop="true" 
            android:entries="@array/monat_anzeige"
            android:entryValues="@array/monat_wert"
        />
        <Spinner
            android:id="@+id/aendern_datum_Jahr"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:drawSelectorOnTop="true" 
            android:entries="@array/jahr_anzeige"
            android:entryValues="@array/jahr_wert"
        />
    </TableRow>
    <!-- Zweck -->
    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Zweck:" 
            android:gravity="left" 
            android:maxWidth="15dp"/>

        <EditText
            android:id="@+id/aendern_zweck"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="text" >

            <requestFocus />
        </EditText>

    </TableRow>
    <!-- Betrag -->
    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Betrag:" 
        />
        <EditText
            android:id="@+id/aendern_betrag"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="number|numberSigned|numberDecimal"
        />
    </TableRow>
    <Button
        android:id="@+id/button_aendern"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/buttontxt_aendern"
        android:onClick="onClickEintragSpeichern" 
    />

</TableLayout>
An der Stelle in meinem Code an der ich die Daten gerne in die Maske setzen möchte wird mir eine NullPointerException geschmissen.

Hier die Klasse:
Code:
package micka.haushaltsbuch;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Spinner;

public class EintragAendernActivity extends Activity
{
    
    final static String MY_DB_NAME = "FinanzenDB";
    static String MY_DB_TABLE = "eintraege";
    final static String tag="ensacom"; 
    long id;
    SQLiteDatabase myDB = null;
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.eintraghinzufuegenlayout);
        myDB = null;
        final Bundle extras = getIntent().getExtras();
        if(extras != null)
        {
            MY_DB_TABLE = extras.getString(EintraegeAnzeigenActivity.TABELLENNAME);
            id = extras.getLong(EintraegeAnzeigenActivity.ID);
        }
        Eintrag eintrag = null;
        myDB = this.openOrCreateDatabase(MY_DB_NAME, MODE_PRIVATE, null);
        Cursor eintragCursor = myDB.rawQuery("SELECT _id, day, month, year, wofuer, betrag FROM " + MY_DB_TABLE + " WHERE _id=" + id + " Order By day, month, year", null);
            
            eintragCursor.moveToFirst();
            if(eintragCursor.moveToFirst())
         {
             eintrag = null;
             eintrag = new Eintrag(eintragCursor.getInt(0),eintragCursor.getInt(1),eintragCursor.getInt(2),eintragCursor.getInt(3),eintragCursor.getString(4),eintragCursor.getDouble(5));
         }
         eintragCursor.close();
         myDB.close();
         if(eintrag != null)
         {
             Log.v(tag, "Vor Edit Eintrag: " + eintrag.day + "." +eintrag.month +"." + eintrag.year +", " + eintrag.wofuer + ", " + eintrag.betrag + ", id=" + eintrag._id);
            Spinner day = (Spinner)findViewById(R.id.aendern_datum_Tag);
             [B]day.setSelection(eintrag.day); [U]//Zeile 48(Siehe LogCat)[/U][/B]
             Spinner month = (Spinner)findViewById(R.id.aendern_datum_Monat);
             month.setSelection(eintrag.month);
             Spinner year = (Spinner)findViewById(R.id.aendern_datum_Jahr);
             month.setSelection(eintrag.year);
             EditText wofuer = (EditText)findViewById(R.id.aendern_zweck);
             wofuer.setText(eintrag.wofuer);
             EditText betrag = (EditText)findViewById(R.id.aendern_betrag);
             wofuer.setText(String.valueOf(eintrag.betrag));
         }
    }
    public void onClickEintragSpeichern(final View sfNormal) 
    {
        ...
    }
}
und hier mein LogCat OutPut:
Code:
01-16 15:08:45.962: E/AndroidRuntime(389): FATAL EXCEPTION: main
01-16 15:08:45.962: E/AndroidRuntime(389): java.lang.RuntimeException: Unable to start activity ComponentInfo{micka.haushaltsbuch/micka.haushaltsbuch.EintragAendernActivity}: java.lang.NullPointerException
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.os.Looper.loop(Looper.java:123)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.ActivityThread.main(ActivityThread.java:4627)
01-16 15:08:45.962: E/AndroidRuntime(389):     at java.lang.reflect.Method.invokeNative(Native Method)
01-16 15:08:45.962: E/AndroidRuntime(389):     at java.lang.reflect.Method.invoke(Method.java:521)
01-16 15:08:45.962: E/AndroidRuntime(389):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-16 15:08:45.962: E/AndroidRuntime(389):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-16 15:08:45.962: E/AndroidRuntime(389):     at dalvik.system.NativeStart.main(Native Method)
01-16 15:08:45.962: E/AndroidRuntime(389): Caused by: java.lang.NullPointerException
[B]01-16 15:08:45.962: E/AndroidRuntime(389):     at micka.haushaltsbuch.EintragAendernActivity.onCreate(EintragAendernActivity.java:48)[/B]
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-16 15:08:45.962: E/AndroidRuntime(389):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
01-16 15:08:45.962: E/AndroidRuntime(389):     ... 11 more
scheinbar kennt der Spinner das ihm im Layout zugeordnete Array noch nicht.

Was mach ich hier falsch?
 
Micka

Micka

Fortgeschrittenes Mitglied
Mir ist gerade aufgefallen das ich im onCreate ein falsches Layout angegeben habe. Dies habe ich dann eben korrigiert so dass setContentview auch wirklich das Layout bekommt, dass ich euch schon gepostet habe.

Seit dieser kleinen Änderung sieht der LogCatOutPut wie folgt aus.
01-17 15:22:57.226: E/AndroidRuntime(13626): FATAL EXCEPTION: main
01-17 15:22:57.226: E/AndroidRuntime(13626): java.lang.IndexOutOfBoundsException
01-17 15:22:57.226: E/AndroidRuntime(13626): at java.util.Arrays$ArrayList.get(Arrays.java:77)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:298)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:351)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.Spinner.makeAndAddView(Spinner.java:189)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.Spinner.layout(Spinner.java:148)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.Spinner.onLayout(Spinner.java:112)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.View.layout(View.java:7034)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1238)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.TableRow.onLayout(TableRow.java:121)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.View.layout(View.java:7034)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.TableLayout.onLayout(TableLayout.java:437)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.View.layout(View.java:7034)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.View.layout(View.java:7034)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.View.layout(View.java:7034)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.View.layout(View.java:7034)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.ViewRoot.performTraversals(ViewRoot.java:1049)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.view.ViewRoot.handleMessage(ViewRoot.java:1744)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.os.Looper.loop(Looper.java:144)
01-17 15:22:57.226: E/AndroidRuntime(13626): at android.app.ActivityThread.main(ActivityThread.java:4937)
01-17 15:22:57.226: E/AndroidRuntime(13626): at java.lang.reflect.Method.invokeNative(Native Method)
01-17 15:22:57.226: E/AndroidRuntime(13626): at java.lang.reflect.Method.invoke(Method.java:521)
01-17 15:22:57.226: E/AndroidRuntime(13626): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
01-17 15:22:57.226: E/AndroidRuntime(13626): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-17 15:22:57.226: E/AndroidRuntime(13626): at dalvik.system.NativeStart.main(Native Method)
Viel weiter als vorher komme ich damit aber leider auch nicht. Sieht jemand wo das Problem liegt?
 
T

the_alien

Experte
Es wird auf einen Index des Arrays zugegriffen der nicht existiert. Also würde ich mal die Arrays die du in der XML angibst checken.
 
Micka

Micka

Fortgeschrittenes Mitglied
Das im Layout verwendete Array ist das gleiche wie das fürs erstellen. Es existieren 31 Items. Sollte passen. Poste gleich mal die Arrays.xml wenn ich am Rechner bin.
 
Micka

Micka

Fortgeschrittenes Mitglied
hier mal die Arrays.xml: Ich hänge mal das komplette Project an, vielleicht liegt der Fehler ja ganz woanders.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <array name="tag_anzeige">
        <item>"01"</item>
          <item>"02"</item>
          <item>"03"</item>
          <item>"04"</item>
          <item>"05"</item>
          <item>"06"</item>
          <item>"07"</item>
          <item>"08"</item>
          <item>"09"</item>
          <item>"10"</item>
          <item>"11"</item>
          <item>"12"</item>
          <item>"13"</item>
          <item>"14"</item>
          <item>"15"</item>
          <item>"16"</item>
          <item>"17"</item>
          <item>"18"</item>
          <item>"19"</item>
          <item>"20"</item>
          <item>"21"</item>
          <item>"22"</item>
          <item>"23"</item>
          <item>"24"</item>
          <item>"25"</item>
          <item>"26"</item>
          <item>"27"</item>
          <item>"28"</item>
          <item>"29"</item>
          <item>"30"</item>
          <item>"31"</item>
      </array>
      <array name="tag_wert">
        <item>01</item>
          <item>02</item>
          <item>03</item>
          <item>04</item>
          <item>05</item>
          <item>06</item>
          <item>07</item>
          <item>08</item>
          <item>09</item>
          <item>10</item>
          <item>11</item>
          <item>12</item>
          <item>13</item>
          <item>14</item>
          <item>15</item>
          <item>16</item>
          <item>17</item>
          <item>18</item>
          <item>19</item>
          <item>20</item>
          <item>21</item>
          <item>22</item>
          <item>23</item>
          <item>24</item>
          <item>25</item>
          <item>26</item>
          <item>27</item>
          <item>28</item>
          <item>29</item>
          <item>30</item>
          <item>31</item>
      </array>
      <array name="monat_anzeige">
          <item>"01"</item>
          <item>"02"</item>
          <item>"03"</item>
          <item>"04"</item>
          <item>"05"</item>
          <item>"06"</item>
          <item>"07"</item>
          <item>"08"</item>
          <item>"09"</item>
          <item>"10"</item>
          <item>"11"</item>
          <item>"12"</item>
    </array>
    <array name="monat_wert">
          <item>01</item>
          <item>02</item>
          <item>03</item>
          <item>04</item>
          <item>05</item>
          <item>06</item>
          <item>07</item>
          <item>08</item>
          <item>09</item>
          <item>10</item>
          <item>11</item>
          <item>12</item>
    </array>
    <array name="jahr_anzeige">
        <item>"2011"</item>
        <item>"2012"</item>
        <item>"2013"</item>
        <item>"2014"</item>
        <item>"2015"</item>
        <item>"2016"</item>
        <item>"2017"</item>
        <item>"2018"</item>
        <item>"2019"</item>
        <item>"2020"</item>
        <item>"2021"</item>
        <item>"2022"</item>
        <item>"2023"</item>
        <item>"2024"</item>
        <item>"2025"</item>
        <item>"2026"</item>
        <item>"2027"</item>
        <item>"2028"</item>
        <item>"2029"</item>
        <item>"2030"</item>
    </array>
    <array name="jahr_wert">
        <item>2011</item>
        <item>2012</item>
        <item>2013</item>
        <item>2014</item>
        <item>2015</item>
        <item>2016</item>
        <item>2017</item>
        <item>2018</item>
        <item>2019</item>
        <item>2020</item>
        <item>2021</item>
        <item>2022</item>
        <item>2023</item>
        <item>2024</item>
        <item>2025</item>
        <item>2026</item>
        <item>2027</item>
        <item>2028</item>
        <item>2029</item>
        <item>2030</item>
    </array>
</resources>
 

Anhänge

  • Haushaltsbuch.zip
    105 KB Aufrufe: 98
M

maniac103

Experte
Kann mir jetzt nicht den Code genau anschauen, aber was spricht eigentlich gegen die Verwendung eines DatePickers?

Sent from my Defy
 
Micka

Micka

Fortgeschrittenes Mitglied
Eigentlich nichts, aber so müsste es ja auch gehen. Hab das Programm schonmal in Java geschrieben und da hab ichs halt so gemacht.