Autore Topic: Errori su semplice applicazione di prova  (Letto 1138 volte)

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Errori su semplice applicazione di prova
« il: 04 Agosto 2014, 11:06:10 CEST »
0
Salve a tutti, sono nuovo di questo forum e di quello della programmazione android.
Vi scrivo perche questa mattina, mentre sviluppavo una piccola applicazione come esercizio ho riscontrato degli errori: lanciando il simulatore android da android studio e aprendo l'applicazione quest'ultima si chiude e mi dice che si e sfortunatamente stoppata.

Codice: [Seleziona]
    Process: com.federico.login, PID: 964
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.federico.login/com.federico.login.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at android.app.Activity.findViewById(Activity.java:1884)
            at com.federico.login.MainActivity.<init>(MainActivity.java:13)
            at java.lang.Class.newInstanceImpl(Native Method)
            at java.lang.Class.newInstance(Class.java:1208)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
questi sono gli errori che mi segnala, e questo è il codice java:
Codice: [Seleziona]
// ACTIVITY 1
public class MainActivity extends ActionBarActivity {

    EditText username = (EditText) findViewById(R.id.editText2);
    EditText password = (EditText) findViewById(R.id.editText);
    String string_username;
    String string_password;

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

    public boolean getRegistrazioneParametri() {
        Intent registrazione = getIntent();
        String usernameRegistrationGiven = registrazione.getStringExtra("registrazione_username");
        String passwordRegistrationGiven = registrazione.getStringExtra("registrazione_password");
        if(username.getText() != null && password.getText() != null){
        String string_username = username.getText().toString();
        String string_password = password.getText().toString();
        return (usernameRegistrationGiven == string_username && passwordRegistrationGiven == string_password);
        }
        else return false;

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        switch (id) {
                case R.id.MENU_1:
                    if (getRegistrazioneParametri()) {
                    Intent second_activity = new Intent(this, MainActivity2.class);
                    second_activity.putExtra("username", string_username);
                    second_activity.putExtra("password", string_password);
                    }
                    break;
                case R.id.MENU_2:
                    Intent third_activity = new Intent(this, MainActivity3.class);
                    startActivity(third_activity);


        }

        return false;
    }
}

//Activity 2
public class MainActivity2 extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);
        Intent second_activity = getIntent();
        String usernameGiven = second_activity.getStringExtra("username");
        String passwordGiven = second_activity.getStringExtra("password");
        TextView text = (TextView) findViewById(R.id.text1);
        text.setText(usernameGiven + " " + passwordGiven);
    }

    @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();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}
//Activity 3
public class MainActivity3 extends ActionBarActivity {

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

    public void registrazione()
    {
        EditText registrazione_username = (EditText) findViewById(R.id.editText);
        EditText registrazione_password = (EditText) findViewById(R.id.editText2);
        Intent registrazione = new Intent(this, MainActivity.class);
        if(registrazione_username.getText() != null && registrazione_password.getText() != null) {

        registrazione.putExtra("registrazione_username", registrazione_username.getText().toString());
        registrazione.putExtra("registrazione_password", registrazione_username.getText().toString());
        startActivity(registrazione);
        }

    }

}

Grazie se mi aiutate :)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errori su semplice applicazione di prova
« Risposta #1 il: 04 Agosto 2014, 11:47:53 CEST »
0
Se vedi bene il logcat , alla riga 13 di MainActivity qualcosa è Null. A occhio è perché il finviewbyid deve stare dentro OnCreate.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errori su semplice applicazione di prova
« Risposta #2 il: 04 Agosto 2014, 14:28:27 CEST »
0
grazie mille, stasera riprovo e vi aggiorno  ;-)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errori su semplice applicazione di prova
« Risposta #3 il: 04 Agosto 2014, 15:07:37 CEST »
0
forse anche le stringhe non inizializzate a null o ""

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Errori su semplice applicazione di prova
« Risposta #4 il: 04 Agosto 2014, 15:55:08 CEST »
0
L'errore è qui:

Codice (Java): [Seleziona]
EditText username = (EditText) findViewById(R.id.editText2);
EditText password = (EditText) findViewById(R.id.editText);

Il findViewById esegue una ricerca su una view di un elemento tramite il suo id.
Non puoi usare questo metodo in fase di dichiarazione dei campi come l'hai fatto tu perchè la view non "esiste" ancora.

Sposta questo codice dentro l'onCreate.
« Ultima modifica: 06 Agosto 2014, 00:40:17 CEST da GabMarioPower »

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errori su semplice applicazione di prova
« Risposta #5 il: 05 Agosto 2014, 11:03:09 CEST »
0
aggiornamento: ho provato a mettere le righe con il findviewbyid nel create e l'applicazione funziona correttamente  :D ... rimane solo un problema (riposto il codice modificato):
Codice: [Seleziona]
//Activity 1
public class MainActivity extends ActionBarActivity {


    String string_username;
    String string_password;

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

    }

    public boolean getRegistrazioneParametri() {
        Intent registrazione = getIntent();
        String usernameRegistrationGiven = registrazione.getStringExtra("registrazione_username");
        String passwordRegistrationGiven = registrazione.getStringExtra("registrazione_password");
        EditText username = (EditText) findViewById(R.id.editText);
        EditText password = (EditText) findViewById(R.id.editText2);
        if(username.getText() != null && password.getText() != null){
        String string_username = username.getText().toString();
        String string_password = password.getText().toString();
        return (usernameRegistrationGiven == string_username && passwordRegistrationGiven == string_password);
        }
        else return false;

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        switch (id) {
                case R.id.MENU_1:
                    if (getRegistrazioneParametri()) {
                    Intent second_activity = new Intent(this, MainActivity2.class);
                    second_activity.putExtra("username", string_username);
                    second_activity.putExtra("password", string_password);
                    }
                    break;
                case R.id.MENU_2:
                    Intent third_activity = new Intent(this, MainActivity3.class);
                    startActivity(third_activity);


        }

        return false;
    }
}

//Activity2
public class MainActivity2 extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);
        Intent second_activity = getIntent();
        String usernameGiven = second_activity.getStringExtra("username");
        String passwordGiven = second_activity.getStringExtra("password");
        TextView text = (TextView) findViewById(R.id.text1);
        text.setText(usernameGiven + " " + passwordGiven);
    }

    @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();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}
//Activity3
public class MainActivity3 extends ActionBarActivity {

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

    public void registrazione(View view)
    {
        EditText registrazione_username = (EditText) findViewById(R.id.editText);
        EditText registrazione_password = (EditText) findViewById(R.id.editText2);
        Intent registrazione = new Intent(this, MainActivity.class);
        if(registrazione_username.getText() != null && registrazione_password.getText() != null) {

        registrazione.putExtra("registrazione_username", registrazione_username.getText().toString());
        registrazione.putExtra("registrazione_password", registrazione_username.getText().toString());
        startActivity(registrazione);
        }

    }

}

In pratica quando ritorno all'activity 1 (del login) dopo aver effettuato una registrazione, non effettua il login (nel senso che il metodo getRegistrazioneParametri ritorna un "false".  :'(

Grazie per l'aiuto.
Federico

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Errori su semplice applicazione di prova
« Risposta #6 il: 05 Agosto 2014, 11:20:09 CEST »
0
Non ho capito cosa dovrebbe fare getRegistrazioneParametri(), cioè perchè username e password da verificare dovrebbero essere contenuti nell'intent.

A parte questo c'è un altro grosso errore sulle basi di Java: le stringhe non si confrontano con ==, ma con .equals()
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errori su semplice applicazione di prova
« Risposta #7 il: 05 Agosto 2014, 11:36:07 CEST »
0
allora, il metodo getRegistrazionePArametri dovrebbe ricevere sia le stringhe date nella registrazione sia quelle inserite nei campi del login e successivamente confrontarle.
Credo che l'errore stia allora nella confrontazione, non sapevo che le stringhe si confrontassero con l'equals... sono ancora un novellino del java.
Riprovo se tutto funziona con questa correzione  :-)


Post unito: [time]05 Agosto 2014, 11:50:24 CEST[/time]
Aggiornamento: il problema resta sempre nel getRegistrazioneParametri: infatti, le due stringhe confrontate con equals() mi danno il warning che potrebbero risultare nulle. Perche? Credo proprio che il problema sia lì  :'(
« Ultima modifica: 05 Agosto 2014, 12:13:30 CEST da FritzTheMaker »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errori su semplice applicazione di prova
« Risposta #8 il: 05 Agosto 2014, 12:22:52 CEST »
0
Devi fare l' override di on resume per ricavarti delle variabili quando ritorni ad un activity

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errori su semplice applicazione di prova
« Risposta #9 il: 05 Agosto 2014, 12:45:24 CEST »
0
mmm... non ti seguo... non devo ricavarmi nessuna variabile quando torno all'activity di login... Dimentico qualcosa?  :'(
Cioe io credo che il problema è che la comparazione delle stringhe nel metodo getRegistrazioneParametri puo generare delle "NullPointerException"
« Ultima modifica: 05 Agosto 2014, 12:52:26 CEST da FritzTheMaker »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errori su semplice applicazione di prova
« Risposta #10 il: 05 Agosto 2014, 13:26:20 CEST »
0
In pratica quando ritorno all'activity 1 (del login) dopo aver effettuato una registrazione, non effettua il login (nel senso che il metodo getRegistrazioneParametri ritorna un "false".  :'(


Cosi hai scritto (da mobile ho problemi con il tag quote)

Quando dici ritorno.... Stiamo parlando di un metodo chiamato onResume() che te non overaddi.

Inoltre nel onCreate di activity1 non c'è nessun metodo. Mi sfugge qualcosa a sto punto.

Inoltre io implementerei un starActivity forma result... Così fai la registrazione e torna alla activity 1

Post unito: 05 Agosto 2014, 13:30:56 CEST
String string_username lo dichiari come campo private.... Poi lo ridichiari dentro il tuo metodo. C'e qualcosa di sbagliato.

E poi manca un break nel secondo case
« Ultima modifica: 05 Agosto 2014, 13:30:56 CEST da tonno16, Reason: Merged DoublePost »

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errori su semplice applicazione di prova
« Risposta #11 il: 06 Agosto 2014, 09:40:56 CEST »
0
allora, scusa la mia ignoranza  O:-) ...
in pratica quando dall'activity 3 torno sulla 1 con un intent, devo comunque overridare l'onResume? Cosa gli scrivo dentro?  o_O
Nell'onCreate del'activity uno non c'è nessun metodo perchè quando viene creata deve solo avere il menu per passare all'activity3  :-)

Ultima cosa: cosa intendi per "start activity forma result"?
Grazie mille

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errori su semplice applicazione di prova
« Risposta #12 il: 06 Agosto 2014, 10:01:58 CEST »
0
getRegistrazipneParametri non lo richiami nel onCreate.

Presumo che sia un metodo invocato da un bottone.
Allora se non ricordo male devi scrivere public void nome metodo(view view)

Offline FritzTheMaker

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Errori su semplice applicazione di prova
« Risposta #13 il: 06 Agosto 2014, 10:36:00 CEST »
0
allora, getRegistrazioneParametri e un metodo richiamato nello switch dell'id del menu:
Codice: [Seleziona]
@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        switch (id) {
            case R.id.MENU_1:
                if (getRegistrazioneParametri()) {
                    Intent second_activity = new Intent(this, MainActivity2.class);
                    second_activity.putExtra("username", string_username);
                    second_activity.putExtra("password", string_password);
                }
                break;
            case R.id.MENU_2:
                Intent third_activity = new Intent(this, MainActivity3.class);
                startActivity(third_activity);
                break

        }

        return false;
    }
}

 ;-)

Post unito: 06 Agosto 2014, 10:40:37 CEST
questo è il messaggio di warning che mi da sulla riga finale del metodo getregistrazione parametri:
Codice: [Seleziona]
Method invocation 'passwordRegistrationGiven.equals(string_password)' may produce 'java.lang.NullPointerException' less... (Ctrl+F1)
This inspection analyzes method control and data flow to report possible conditions that are always true or false, expressions whose value is statically proven to be constant, and situations that can lead to nullability contract violations.
Variables, method parameters and return values marked as @Nullable or @NotNull are treated as nullable (or not-null, respectively) and used during the analysis to check nullability contracts, e.g. report possible NullPointerException errors.
More complex contracts can be defined using @Contract annotation, for example:
@Contract("_, null -> null") — method returns null if its second argument is null @Contract("_, null -> null; _, !null -> !null") — method returns null if its second argument is null and not-null otherwise @Contract("true -> fail") — a typical assertFalse method which throws an exception if true is passed to it
The inspection can be configured to use custom @Nullable
@NotNull annotations (by default the ones from annotations.jar will be used
« Ultima modifica: 06 Agosto 2014, 10:40:37 CEST da FritzTheMaker, Reason: Merged DoublePost »