IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Null Pointer Exception


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2015
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2015
    Messages : 185
    Par défaut Null Pointer Exception
    Bonjour à tous !
    Je suis en train de créer une application de planning. Je vais stocker toutes les infos dans une base SQLite mais je débute en base de données...

    J'ai pas mal avancé mais là, je butte bêtement sur un NullPointerException que je ne comprends pas. Je suis peut-être miro, mdr.

    Le message du Logcat est le suivant : "java.lang.NullPointerException: Attempt to invoke virtual method 'void com.xxx.test3.PlanDBHelper.addDays(com.xxx.test3.Days)' on a null object reference at com.xxx.test3.AddActivity$1.onClick(AddActivity.java:55)". Mais en fait je ne vois pas quelle variable peut bien être null...

    Voici le code de ma classe AddActivity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    package com.xxx.test3;
     
    import androidx.appcompat.app.AppCompatActivity;
     
    import android.content.Context;
    import android.os.Bundle;
    import android.text.Editable;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.Spinner;
    import android.widget.Toast;
     
    public class AddActivity extends AppCompatActivity {
     
        private EditText editDate;
        private EditText editTS;
        private EditText editPro;
        private EditText editInco;
        private EditText editHSynd;
        private Spinner spinPoste;
        private Spinner spinFonc;
        private Spinner spinSect;
        private Spinner spinHRapp;
     
        private Button validate;
        private ImageButton buttExit;
     
        private String poste, fonction, secteur;
        private double ts;
        private double pro;
        private double inco;
        private double hsynd;
        private int rappels;
     
        private CharSequence text;
        private int error = 1;
        private PlanDBHelper mDatabase;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add);
     
            validate = findViewById(R.id.validate);
            validate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    error = 0;
                    recupInfos();
                    if (error == 0) {
                        Days newDay = new Days(poste, fonction, secteur, ts, pro, inco, rappels, hsynd);
                        mDatabase.addDays(newDay);   // C'est cette ligne qui pose problème !
                        text = "Poste ajouté !";
                        toasts(text);
                        AddActivity.this.finish(); }
                }
            });
     
            buttExit = findViewById(R.id.buttExit);
            buttExit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    AddActivity.this.finish();
                }
            });
        }
     
        private void recupInfos() {
            editDate = findViewById(R.id.editDate);
            editTS = findViewById(R.id.editTS);
            editPro = findViewById(R.id.editPro);
            editInco = findViewById(R.id.editInco);
            editHSynd = findViewById(R.id.editHSynd);
            spinPoste = findViewById(R.id.spinPoste);
            spinFonc = findViewById(R.id.spinFonc);
            spinSect = findViewById(R.id.spinSect);
            spinHRapp = findViewById(R.id.spinHRapp);
     
            String valTS = editTS.getText().toString();
            if (TextUtils.isEmpty(valTS)) {ts = 0d;}
            else {
                try {
                    ts = Double.valueOf(valTS);
                } catch (NumberFormatException e) {
                    text = "Entrez une valeur numérique pour les travaux sales";
                    toasts(text);
                    error = 1;
                }
            }
     
            String valPro = editPro.getText().toString();
            if (TextUtils.isEmpty(valPro)) {pro = 0d;}
            else {
                try {
                    pro = Double.valueOf(valPro);
                } catch (NumberFormatException e) {
                    text = "Entrez une valeur numérique pour la prolongation de poste";
                    toasts(text);
                    error = 1;
                }
            }
     
            String valInco = editInco.getText().toString();
            if (TextUtils.isEmpty(valInco)) {inco = 0d;}
            else {
                try {
                    inco = Double.valueOf(valInco);
                } catch (NumberFormatException e) {
                    text = "Entrez une valeur numérique pour les incommodités";
                    toasts(text);
                    error = 1;
                }
            }
     
            String valSynd = editHSynd.getText().toString();
            if (TextUtils.isEmpty(valSynd)) {hsynd = 0d;}
            else {
                try {hsynd = Double.valueOf(valSynd);}
                catch (NumberFormatException e) {
                    text = "Entrez une valeur numérique pour les heures syndicales";
                    toasts(text);
                    error = 1;
                }
            }
     
            String valHRapp = spinHRapp.getSelectedItem().toString();
            rappels = Integer.valueOf(valHRapp);
     
            poste = spinPoste.getSelectedItem().toString();
            if (poste.equals("-Choix du poste-")) {
                text = "Sélectionnez un poste";
                toasts(text);
                error = 1;
            }
            fonction = spinFonc.getSelectedItem().toString();
            if (fonction.equals("-Choix de la fonction-")) {
                text = "Sélectionnez une fonction";
                toasts(text);
                error = 1;
            }
            secteur = spinSect.getSelectedItem().toString();
            if (secteur.equals("-Secteur-")) {
                text = "Sélectionnez un secteur";
                toasts(text);
                error = 1;
            }
        }
     
        private void toasts(CharSequence text) {
            Context context = getApplicationContext();
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
        }
    }
    celui de la classe PlanDBHelper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    package com.xxx.test3;
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import java.util.ArrayList;
     
    public class PlanDBHelper extends SQLiteOpenHelper {
        public static final int DATABASE_VERSION = 1;
        public static final String DATABASE_NAME = "planlist.db";
        private static final String TABLE_DAYS = "Days";
        private static final String COLUMN_ID = "_id";
        private static final String COLUMN_POSTE = "dayPoste";
        private static final String COLUMN_FONCTION = "dayFonction";
        private static final String COLUMN_SECTEUR = "daySecteur";
        private static final String COLUMN_TS = "dayTS";
        private static final String COLUMN_PRO = "dayPro";
        private static final String COLUMN_INCO = "dayInco";
        private static final String COLUMN_RAPP = "dayRapp";
        private static final String COLUMN_SYND = "daySynd";
        public PlanDBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }
     
        @Override
        public void onCreate(SQLiteDatabase db) {
            String CREATE_PLANLIST_TABLE = "CREATE TABLE "
                    + TABLE_DAYS + "(" + COLUMN_ID
                    + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + COLUMN_POSTE + " TEXT NOT NULL,"
                    + COLUMN_FONCTION + " TEXT NOT NULL,"
                    + COLUMN_SECTEUR + " TEXT NOT NULL,"
                    + COLUMN_TS + " REAL NOT NULL,"
                    + COLUMN_PRO + " REAL NOT NULL,"
                    + COLUMN_INCO + " REAL NOT NULL,"
                    + COLUMN_RAPP + " INTEGER NOT NULL,"
                    + COLUMN_SYND + " REAL NOT NULL" + ")";
            db.execSQL(CREATE_PLANLIST_TABLE);
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_DAYS);
            onCreate(db);
        }
        public ArrayList<Days> listDays() {
            String sql = "select * from " + TABLE_DAYS;
            SQLiteDatabase db = this.getReadableDatabase();
            ArrayList<Days> storeDays = new ArrayList<>();
            Cursor cursor = db.rawQuery(sql, null);
            if (cursor.moveToFirst()) {
                do {
                    int id = Integer.parseInt(cursor.getString(0));
                    String poste = cursor.getString(1);
                    String fonction = cursor.getString(2);
                    String secteur = cursor.getString(3);
                    Double ts = Double.valueOf(cursor.getString(4));
                    Double pro = Double.valueOf(cursor.getString(5));
                    Double inco = Double.valueOf(cursor.getString(6));
                    int rapp = Integer.parseInt(cursor.getString(7));
                    Double synd = Double.valueOf(cursor.getString(8));
                    storeDays.add(new Days(id, poste, fonction, secteur, ts, pro, inco, rapp, synd));
                }
                while (cursor.moveToNext());
            }
            cursor.close();
            return storeDays;
        }
        void addDays(Days days) {
            ContentValues values = new ContentValues();
            values.put(COLUMN_POSTE, days.getPoste());
            values.put(COLUMN_FONCTION, days.getFonction());
            values.put(COLUMN_SECTEUR, days.getSecteur());
            values.put(COLUMN_TS, days.getTS());
            values.put(COLUMN_PRO, days.getPro());
            values.put(COLUMN_INCO, days.getInco());
            values.put(COLUMN_RAPP, days.getRapp());
            values.put(COLUMN_SYND, days.getSynd());
            SQLiteDatabase db = this.getWritableDatabase();
            db.insert(TABLE_DAYS, null, values);
        }
        void updateDays(Days days) {
            ContentValues values = new ContentValues();
            values.put(COLUMN_POSTE, days.getPoste());
            values.put(COLUMN_FONCTION, days.getFonction());
            values.put(COLUMN_SECTEUR, days.getSecteur());
            values.put(COLUMN_TS, days.getTS());
            values.put(COLUMN_PRO, days.getPro());
            values.put(COLUMN_INCO, days.getInco());
            values.put(COLUMN_RAPP, days.getRapp());
            values.put(COLUMN_SYND, days.getSynd());
            SQLiteDatabase db = this.getWritableDatabase();
            db.update(TABLE_DAYS, values, COLUMN_ID + " = ?", new String[]{String.valueOf(days.getId())});
        }
        void deleteDay(int id) {
            SQLiteDatabase db = this.getWritableDatabase();
            db.delete(TABLE_DAYS, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
        }
    }
    et enfin celui de la classe Days :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    package com.xxx.test3;
     
    public class Days {
        private int id;
        private String poste;
        private String fonction;
        private String secteur;
        private Double ts;
        private Double pro;
        private Double inco;
        private int rapp;
        private Double synd;
     
        Days(String poste, String fonction, String secteur, Double ts, Double pro, Double inco, int rapp, Double synd) {
            this.poste = poste;
            this.fonction = fonction;
            this.secteur = secteur;
            this.ts = ts;
            this.pro = pro;
            this.inco = inco;
            this.rapp = rapp;
            this.synd = synd;
        }
     
        Days(int id, String poste, String fonction, String secteur, Double ts, Double pro, Double inco, int rapp, Double synd) {
            this.id = id;
            this.poste = poste;
            this.fonction = fonction;
            this.secteur = secteur;
            this.ts = ts;
            this.pro = pro;
            this.inco = inco;
            this.rapp = rapp;
            this.synd = synd;
        }
     
        public int getId() {
            return id;
        }
     
        public void setId(int id) {
            this.id = id;
        }
     
        public String getPoste() {
            return poste;
        }
     
        public void setPoste(String poste) {
            this.poste = poste;
        }
     
        public String getFonction() {
            return fonction;
        }
     
        public void setFonction(String fonction) {
            this.fonction = fonction;
        }
     
        public String getSecteur() {
            return secteur;
        }
     
        public void setSecteur(String secteur) {
            this.secteur = secteur;
        }
     
        public Double getTS() {
            return ts;
        }
     
        public void setTS(Double ts) {
            this.ts = ts;
        }
     
        public Double getPro() {
            return pro;
        }
     
        public void setPro(Double pro) {
            this.pro = pro;
        }
     
        public Double getInco() {
            return inco;
        }
     
        public void setInco(Double inco) {
            this.inco = inco;
        }
     
        public int getRapp() {
            return rapp;
        }
     
        public void setRapp(int rapp) {
            this.rapp = rapp;
        }
     
        public Double getSynd() {
            return synd;
        }
     
        public void setSynd(Double synd) {
            this.synd = synd;
        }
    }
    Petites précisions :
    - les valeurs des editText sont bien récupérées car j'arrive à les faire sortir dans le Logcat via System.out.println.
    - j'ai constaté également que la base de données est bien créé, elle contient la table avec les colonnes mais par contre elle ne contient aucune donnée.

    Voilà, je vous remercie infiniment pour votre aide !

  2. #2
    Membre chevronné
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 348
    Par défaut
    Bonjour,

    Je ne vois pas ou est initialisé mDatabase dans AddActivity..

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2015
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2015
    Messages : 185
    Par défaut
    Roooh...
    J'étais vraiment très fatigué ce matin à 4h00. Il était temps que je me couche...
    Merci beaucoup gervais.b pour ta réponse !

    J'en profite pour poser une autre question.
    Mon application est basée sur une DrawerActivity. J'ai un fragment qui m'affiche les éléments de planning enregistrés dans la bdd avec des cardview dans un recyclerview.
    J'ai mis un floatingactionbutton dans mon fragment qui m'envoie vers une nouvelle activité qui s'ouvre par-dessus dans laquelle il y a des champs à remplir pour ajouter un nouvel élément de planning. Quand je clique sur valider, toutes les valeurs des champs sont récupérées, envoyée vers la bdd et la nouvelle activité est fermée et ainsi on retombe naturellement sur le fragment de départ.
    Mais le fragment n'a pas pris en compte les nouvelles données de la bdd. Il ne les prendra en compte qu'au prochain lancement de l'appli.
    D'où ma question, quelle commande puis-je mettre dans l'activité que je ferme pour demander au fragment de se rafraichir ?

    D'avance merci !

  4. #4
    Membre chevronné
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 348
    Par défaut
    Avec plaisir pour la première réponse. Pensez à marquer la discussion comme résolue..

    Pour la seconde, je n'ai pas fait de dev Android suffisamment longtemps pour vous donner une bonne réponse. Vous devriez la poser sur le forum dédié à Android. Mais je suppose que vous devriez pouvoir relancer la même Activity lorsque votre formulaire se ferme. Elle rechargerait donc ces données. Ou vous devriez pouvoir communiquer avec cette Activity pour qu'elle se recharge ou ajoute cette nouvelle ligne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tomcat 5.5 Null Pointer Exception
    Par nono44200 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 07/04/2007, 10h00
  2. Null pointer Exception pour ma Fenetre
    Par LeXo dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 22/01/2007, 09h17
  3. Null Pointer Exception
    Par gloglo dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2006, 11h32
  4. [Struts] Null Pointer Exception
    Par n@n¤u dans le forum Struts 1
    Réponses: 1
    Dernier message: 01/08/2006, 13h10
  5. Null Pointer Exception
    Par snouppy dans le forum JBuilder
    Réponses: 3
    Dernier message: 13/06/2006, 21h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo