Autore Topic: ERRORE: "gettext on a null object reference."  (Letto 648 volte)

Offline CarloAndroid

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    windows 8 e ubuntu 14.04 LTS
ERRORE: "gettext on a null object reference."
« il: 29 Agosto 2015, 13:54:28 CEST »
0
ciao,
premetto che sono alle prime armi con android e con java.
sto sviluppando una piccola app che ti fa da lista della spesa(so che ce ne sono già sul play store, ma lo faccio solo per esercitarmi).
Le API minime dell'app sono 22, e il dispositivo con lui test l'app a API 22.
durante la compilazione va tutto bene ma quando avvio l'app sul mio nexus 5 e provo ad aggiungere un'oggetto alla lista l'applicazione si chiude e questo è  il loccat dell'errore:



Codice: [Seleziona]
08-29 13:46:12.159    6732-6732/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.carlo.listadellaspesa, PID: 6732
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
            at com.example.carlo.listadellaspesa.ListaSpesaActivity.aggiungiarticolo(ListaSpesaActivity.java:132)
            at com.example.carlo.listadellaspesa.ListaSpesaActivity$1.onClick(ListaSpesaActivity.java:116)
            at android.view.View.performClick(View.java:4780)
            at android.view.View$PerformClick.run(View.java:19866)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)


e questo è il file java:

Codice (Java): [Seleziona]
package com.example.carlo.listadellaspesa;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintWriter;
import java.nio.Buffer;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Objects.*;


public class ListaSpesaActivity extends Activity implements AdapterView.OnItemLongClickListener {
    private EditText editNome;
    private EditText editQuantita;
    private String nome1;
    private String quantita1;
    public ArrayAdapter<Articolo> adapter;
    public static ArrayList<Articolo> listaArticoli = new ArrayList<Articolo>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_spesa);
        ListView lista = (ListView) this.findViewById(R.id.activity_lista_spesa_lista);
        adapter = new ArrayAdapter<Articolo>(this, android.R.layout.simple_list_item_2, listaArticoli);
        lista.setAdapter(adapter);
        lista.setOnItemLongClickListener(this);
        Context context = getApplicationContext();
        CharSequence text = "SUGGERIMENTO: per eliminare un articolo dalla lista tocca e tieni premuto su di esso.";
        int duration = Toast.LENGTH_LONG;
        Toast toast = Toast.makeText(context, text, duration);
        toast.show();
        carica();
    }









    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_lista_spesa, menu);
        return super.onCreateOptionsMenu(menu);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
       if (id == R.id.action_lista_spesa_aggiungi) {
            dialogoaggiungi();
        }


        if (id == R.id.action_lista_spesa_cancella_tutto) {
            listaArticoli.clear();
            adapter.notifyDataSetChanged();
            salva();
            return true;
        }
        if (id == R.id.action_lista_spesa_salva) {
            salva();
            return true;
        }
        if (id == R.id.action_lista_spesa_carica) {
            listaArticoli.clear();
            carica();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    public void dialogoaggiungi(){
        final Dialog dialogo=new Dialog(this);
        dialogo.setTitle("Aggiungi Articolo");
        dialogo.setCancelable(true);
        dialogo.setContentView(R.layout.dialog);
        dialogo.show();
        Button bottoneAggiungi=(Button) dialogo.findViewById(R.id.dialog_aggiungi);
        bottoneAggiungi.setOnClickListener(new View.OnClickListener() {


            public void onClick(View view) {
                aggiungiarticolo();
                dialogo.dismiss();

                }} );       }


    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        listaArticoli.remove(position);
        adapter.notifyDataSetChanged();
        return true;
    }

    public void aggiungiarticolo(){
        Articolo nuovoArticolo = new Articolo();
        editNome=(EditText)findViewById(R.id.dialog_nome);
        editQuantita=(EditText)findViewById(R.id.dialog_quantita);
        nome1 = editNome.getText().toString();
        quantita1 = editQuantita.getText().toString();
        nuovoArticolo.nome = nome1;
        nuovoArticolo.quantita = quantita1;
        ListaSpesaActivity.listaArticoli.add(nuovoArticolo);
        salva();
    }

    public void carica() {
        File file = new File(this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "ListaSpesa.txt");
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String temp = reader.readLine();
            while (temp != null) {
                String[] vettore = temp.split("\t");
                Articolo articolo = new Articolo();
                articolo.nome = vettore[0];
                articolo.quantita = vettore[1];
                listaArticoli.add(articolo);
                temp = reader.readLine();
            }
        } catch (Exception e) {
        }
        adapter.notifyDataSetChanged();
    }

            public void cliccaAggiungiHome(View view) {
        dialogoaggiungi();
            }

            public void salva() {
                File file = new File(this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "ListaSpesa.txt");
                PrintWriter scrittore = null;
                try {
                    scrittore = new PrintWriter(new FileOutputStream(file));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                for (Articolo articolo : listaArticoli) {
                    assert scrittore != null;
                    scrittore.println(articolo.nome + "\t" + articolo.quantita);
                }
                assert scrittore != null;
                scrittore.close();
            }

}


l'errore è nel metodo aggiungi articolo.
non capisco che cos'ha...
aiutatemi per favore!!!!!!
grazie in anticipo..
Carlo.
« Ultima modifica: 29 Agosto 2015, 13:57:49 CEST da CarloAndroid »

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ERRORE: \"gettext on a null object reference.\"
« Risposta #1 il: 30 Agosto 2015, 00:03:58 CEST »
0
Spesso questi errori li vedo quando ci sta un incongruenza tra XML e richiamo java ... posta l XML


Post unito: 30 Agosto 2015, 00:12:30 CEST
Ti aggiungo anche che In questa riga
Codice (Java): [Seleziona]
  editNome=(EditText)findViewById(R.id.dialog_nome
Leggo dialog _ nome e penso ... l edittext è  nella XML della dialog o dell activity ?  Xke così lo stai prendendo dalla a activity , se invece sta nel XML dialog ... allora devi dirgli che sta lì passando la view ,  saluti
« Ultima modifica: 30 Agosto 2015, 00:12:30 CEST da pietroconti89, Reason: Merged DoublePost »

Offline CarloAndroid

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    windows 8 e ubuntu 14.04 LTS
Re:ERRORE: "gettext on a null object reference."
« Risposta #2 il: 30 Agosto 2015, 10:19:20 CEST »
0
ciao,
grazie della risposta!
questo è l'xml del dialogo:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
<EditText
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:id="@+id/dialog_nome"
   android:hint="Iserisci il nome dell'articolo"
   android:layout_marginTop="15dp"
   android:layout_marginLeft="10dp"
   android:layout_marginRight="10dp"
   />

<EditText
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:hint="Inserisci la quantità"
   android:id="@+id/dialog_quantita"
   android:layout_marginLeft="10dp"
   android:layout_marginRight="10dp"/>

<Button
   android:animation="@anim/abc_slide_in_bottom"
   android:layout_height="wrap_content"
   android:layout_width="match_parent"
   android:id="@+id/dialog_aggiungi"
   android:text="Aggiungi"
   android:layout_marginLeft="10dp"
   android:layout_marginRight="10dp"
   android:layout_marginBottom="15dp"/>


    </LinearLayout>


e questo è l'xml dell'activity

Codice (XML): [Seleziona]
<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:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context="com.example.carlo.listadellaspesa.ListaSpesaActivity"
   android:weightSum="1">

    <ListView
       android:id="@+id/activity_lista_spesa_lista"
       android:layout_width="match_parent"
       android:layout_height="match_parent"/>

    <Button
       android:animation="@anim/abc_slide_in_bottom"
       android:onClick="cliccaAggiungiHome"
       android:id="@+id/activity_lista_spesa_bottone_aggiungi"
       android:text="+"
       android:textSize="20dp"
       android:layout_height="60dp"
       android:layout_width="60dp"
       android:background="@drawable/bottone"
       android:layout_alignBottom="@id/activity_lista_spesa_lista"
       android:layout_alignParentEnd="true" />

</RelativeLayout>

come ho già detto sono un principiante e non ho capito questa frase...

"devi dirgli che sta lì passando la view"


se ti serve qualcos altro dimmelo!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:ERRORE: \"gettext on a null object reference.\"
« Risposta #3 il: 30 Agosto 2015, 11:28:08 CEST »
0
Le view in questione sono due. Un xml per activity e uno per Il dialogo.

Se fai un findviewby id sul layout della tua activity e hai l'obiettivo di avere la view (edittrxt) del layout del dialogo allora commetti un errore. Come per il bottone che fai dialogo.find se hai la edittext nel dialogo devi fare dialogo.find() anche per la edittext.

Post unito: 30 Agosto 2015, 11:29:18 CEST
Aggiunto di chiamate .tostring(). Perche spesso ho avuto errori manipolando un charsequence proveniente da un edittext.getText()

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:ERRORE: "gettext on a null object reference."
« Risposta #4 il: 30 Agosto 2015, 11:30:27 CEST »
0
ciao ti confermo che il problema sta nel dove vai a prendere gli oggetti EditText
attualmente fai
Codice (Java): [Seleziona]
editNome=(EditText)findViewById(R.id.dialog_nome);
        editQuantita=(EditText)findViewById(R.id.dialog_quantita);

che è traducibile in
Codice (Java): [Seleziona]
editNome=(EditText)Activity.findViewById(R.id.dialog_nome);
        editQuantita=(EditText)Activity.findViewById(R.id.dialog_quantita);

ma tu dialog_nome e dialog_quantita , li hai nel layout della dialog
quindi deve diventare cosi

Codice (Java): [Seleziona]
editNome=(EditText)Dialog.findViewById(R.id.dialog_nome);
        editQuantita=(EditText)Dialog.findViewById(R.id.dialog_quantita);
che va letto come l'oggetto edittext me lo vai a prendere nel layout della dialog ....
applicata al tuo caso fai cosi
Codice (Java): [Seleziona]
public void dialogoaggiungi(){
        final Dialog dialogo=new Dialog(this);
        dialogo.setTitle("Aggiungi Articolo");
        dialogo.setCancelable(true);
        dialogo.setContentView(R.layout.dialog);
        editNome=(EditText)dialog.findViewById(R.id.dialog_nome);
        editQuantita=(EditText)dialog.findViewById(R.id.dialog_quantita);
        dialogo.show();
        Button bottoneAggiungi=(Button) dialogo.findViewById(R.id.dialog_aggiungi);
        bottoneAggiungi.setOnClickListener(new View.OnClickListener() {


            public void onClick(View view) {
                aggiungiarticolo();
                dialogo.dismiss();

                }} );       }

come vedi dichiaro gli oggetti EditText direttamente dove avvi la dialog e ora puoi fare cosi

Codice (Java): [Seleziona]
public void aggiungiarticolo(){
        Articolo nuovoArticolo = new Articolo();
        nome1 = editNome.getText().toString();
        quantita1 = editQuantita.getText().toString();
        nuovoArticolo.nome = nome1;
        nuovoArticolo.quantita = quantita1;
        ListaSpesaActivity.listaArticoli.add(nuovoArticolo);
        salva();
    }

saluti

Offline CarloAndroid

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 5
  • Sistema operativo:
    windows 8 e ubuntu 14.04 LTS
Re:ERRORE: \"gettext on a null object reference.\"
« Risposta #5 il: 30 Agosto 2015, 11:39:13 CEST »
0
Grazie mille,
Ho risolto..
Un'altra piccola cosa che mi era già capitata ma non ricordo come avevo risolto...
quando aggiungo un oggetto alla listview non c'è scritto il nome e la quantità, ma un indirizzo di memoria.
Saluti.
« Ultima modifica: 30 Agosto 2015, 16:59:12 CEST da CarloAndroid »