# Null-Pointer-Exception in ListView - wird über Datenbank gefüllt



## KleeSchulz (2. Apr 2022)

Hallo Leute, 

aktuell bekomm ich bei der letzten Kategorie in meiner ListView folgende Fehlermeldung


```
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.CheckedTextView.getText()' on a null object reference
        at BLUB.App.saufio.MainActivity.gebeKategorie(MainActivity.java:362)
        at BLUB.App.saufio.MainActivity.btn_zumSpiel(MainActivity.java:281)
```

Dies ist die Methode, bei der der Fehler auftritt. Es spielt keine Rolle, ob die Elemente mehrmals ausgewählt werden. Das Programm stürzt immer in der 4. Kategorie ab.

```
private String gebeKategorie(){
    SparseBooleanArray sp = lv_kategorie.getCheckedItemPositions();
    StringBuilder sb= new StringBuilder();
    Log.i("INFO",sb.toString());
        for(int i=0;i<sp.size();i++){
        if(sp.valueAt(i)==true){
            Log.i("HURE12",sb.toString());
            sb.append("'");
            String s;
            try {
                s = ((CheckedTextView) lv_kategorie.getChildAt(i)).getText().toString(); //line 362
            } finally {
                //TODO Bug beheben, Kategorien
                //sb = sb.append("Sport");
            }
                sb = sb.append(s+"',");
            }
        }

        if (sb.length()==0){
            return "0";
        }
        else{
            return sb.toString().substring(0, sb.length() - 1);
        }
    }
```

Das 4. Element wird gefüllt: Hier ist der Code. Um das Array zu füllen, verwenden Sie die Funktion:

Dies ist in der Main:

    kategorie=db.getKategorien().toArray(new String[0])

und das ist die Methode get.kategorien:

    public List<String> getKategorien() {
                List<String> kategorieList = new ArrayList<String>();
                String selectQuery = "SELECT max(" + KEY_KATEGORIE + ")," + KEY_KATEGORIE + " FROM " + TABLE_AUFGABE + " group by " + KEY_KATEGORIE + " order by " + KEY_ID;
                SQLiteDatabase db = this.getWritableDatabase();
                Cursor cursor = db.rawQuery(selectQuery, null);
                if (cursor.moveToFirst()) {
                    do {
                        kategorieList.add(cursor.getString(0));
                    } while (cursor.moveToNext());
                }
                Log.i("Database", "Aufgabe Liste: " + kategorieList);
                return kategorieList;
            }

und hier die Methode initListViewKategorie

    private void initListViewKategorie() {
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, kategorie);
        lv_kategorie.setAdapter(arrayAdapter);
        for (int i = 0; i < kategorie.length; i++) {
            lv_kategorie.setItemChecked(i, false);
        }
    }

Ich habe versucht, den Fehler mit try and catch block abzufangen. Fügen Sie eine weitere letzte Kategorie hinzu, aber es ist nur in der 4. Kategorie


----------



## Jw456 (3. Apr 2022)

```
if (cursor.moveToFirst()) {
    do {
        kategorieList.add(cursor.getString(0));
    } while (cursor.moveToNext());
}
```

teste erstmal wie viele  Elemente im Cursor sind und setze ihn dann auf Anfang.

Do While finde ich hier auch nicht sinnvoll die wird ja mindestens immer einmal durchlaufen auch wenn der Cuore am ende steht.

Ps

```
s = ((CheckedTextView) lv_kategorie.getChildAt(i)).getText().toString(); //line 362
```
was ist "lv_kategorie" ?


----------

