NullReferenceException J'ai besoin d'aide ! Rien ne fonctionnne ! :(

Résolu
phyyl Messages postés 15 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 17 juin 2013 - 5 sept. 2011 à 04:22
 Jose - 26 juin 2014 à 11:24
Bonjour, hier j'ai pensé à une façon de stocker des tables dans un fichier texte, et j'ai voulu l'essayer. En gros, le code qui suit ne sert qu'à ouvrir le fichier et stocker la table dans un array à 2 dimensions table()(). Mon problème, c'est qu'en l'exécutant, j'obtiens l'erreur suivante : "A System.NullReferenceException has thrown.:"Object reference not set to an instance of an object." à la ligne 24.

J'ai beau tout essayer, rien ne fonctionne !

Merci d'avance pour votre aide, Phyyl

Voici le code :
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Dim sw As StreamWriter = New StreamWriter("c:/Test1.test")
        'sw.WriteLine("")
        'sw.Close()
        Dim sr As StreamReader = New StreamReader("c:/test1.test")
        Dim all As String = sr.ReadToEnd
        Dim split() As String = all.Split(";").ToArray
        Dim table()() As String

        For i = 0 To split.Length
            Dim id As String
            Dim name As String
            Dim phone As String
            Dim a() As String = split(i).Split("/").ToArray

            id = a(0)
            name = a(1)
            phone = a(2)

            table(i)(0) = a(0)
            table(i)(1) = a(1)
            table(i)(2) = a(2)

        Next

    End Sub
End Class

8 réponses

biolo24fr Messages postés 87 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 28 mai 2013 1
5 sept. 2011 à 09:42
Salut,

Ton tableau (table) n'est pas initialisé. C'est à dire qu'il faut lui donner la taille qu'il doit avoir dans ta boucle...

ton code sera plus

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sr As StreamReader =  New StreamReader("c:\test1.test")
        Dim all As String = sr.ReadToEnd
        Dim split() As String = all.Split(";").ToArray
         Dim table(split.Length - 1)() As String    ' tu initialises ton tableau avec le nombre de ligne

        For i  = 0 To split.Length - 1 'ici split.Length - 1 sinon tu vas trop loin dans ton tableau split
            Dim id As String
            Dim name As String
            Dim phone As String
            Dim a() As String =  split(i).Split("/").ToArray

            id = a(0)
            name = a(1)
            phone = a(2)
             ReDim table(i)(2)  'ici tu règles le nombre d’éléments par ligne
            table(i)(0)  = a(0)
            table(i)(1) = a(1)
            table(i)(2) = a(2)

        Next

    End Sub



Attention tu dois faire certains contrôles

-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
5 sept. 2011 à 18:23
Bonjour,

Dans ton cas, plutot aller du coté des collections :
List(Of String())

ça sera plus souple et plus rapide.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
phyyl Messages postés 15 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 17 juin 2013
6 sept. 2011 à 03:43
Wow merci biolo ! ca explique bien des choses... je ne savais pas qu'il fallait initialiser la "top layer" d'un array ! et je ne savais pas comment utiliser ReDim ! Merci ! :)
0
phyyl Messages postés 15 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 17 juin 2013
6 sept. 2011 à 03:52
Et NHenry tu pourrais développer un peu ? parce que je suis pas très famillier avec les collections ... Merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
biolo24fr Messages postés 87 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 28 mai 2013 1
6 sept. 2011 à 09:42
Salut,

Juste pour info tu peux mettre plutôt un redim preserv qui est plus juste. Comme l'a dit NHenry il vaut mieux utiliser les List(Of ). Par exemple tu peux créer une classe qui va te créer un objet "personne" avec les arguments id,name,phone et tu feras ainsi un List(of personne)

Classe personne :

Public Class Personne

    Private mid As String
    Private mName As String
    Private mphone As String

    Public Property id() As String
        Get
            Return mid
        End Get
        Set(ByVal value As String)
            mid = value
        End Set
    End Property


    Public Property Name() As String
        Get
            Return mName
        End Get
        Set(ByVal value As String)
            mName = value
        End Set
    End Property

    Public Property phone() As String
        Get
            Return mphone
        End Get
        Set(ByVal value As String)
            mphone = value
        End Set
    End Property

    Public Sub AddPersonne(ByVal id As String, ByVal name As String, ByVal phone As String)
        mid = id
        mName = name
        mphone = phone
    End Sub
  
End Class



Ensuite dans ton dev tu feras :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sr As StreamReader = New StreamReader("c:\test1.test")
        Dim all As String = sr.ReadToEnd
        Dim split() As String = all.Split(";").ToArray
        Dim table As List(Of Personne) = New List(Of Personne)

        For i = 0 To split.Length - 1 'à chaque boucle tu crées une personne et tu l'ajoutes à ta liste         
            Dim a() As String = split(i).Split("/").ToArray
            Dim personne As New Personne
            personne.AddPersonne( a(0), a(1),a(2))
        Next
    End Sub


tu peux manipuler facilement la liste en la parcourant comme un tableau...

En espérant que ça t'aide... Comme je t'ai dit il faut faire certains contrôles (contrôle du chemin du fichier, que ton split soit pas vide etc....)

-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
0
biolo24fr Messages postés 87 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 28 mai 2013 1
6 sept. 2011 à 09:44
Juste pour info, pour l'initialisation de "table" tu peux mettre aussi :
 Dim table As List(Of Personne) = New List(Of Personne)

est équivalent à


 Dim table As new List(Of Personne) 



-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
6 sept. 2011 à 15:17
Bonjour,

Merci biolo24fr pour ton explication complétant bien mon embryon d'idée.

Juste pour précision (détail) :
Ces 2 lignes sont similaire, mais pas identiques :
Dim table As List(Of Personne) = New List(Of Personne)
Dim table As new List(Of Personne)


Car si on fait dans le code :
table = Nothing


La première ligne conservera le Nothing alors que la 2ième recréera une instance de la classe.

De fait, la première ligne est plus optimisée que la 2ième.

Juste pour la précision.

Mon site
0
phyyl Messages postés 15 Date d'inscription mercredi 8 juin 2011 Statut Membre Dernière intervention 17 juin 2013
7 sept. 2011 à 06:42
Merci tout le monde, j'ai finalement réussi a faire fonctionner mon truc, en gros, j'utilisais id,name,phone simplement comme exemple... en faite, je suis en train de créer un programme de gestion de prix et d'inventaire. Grace a votre aide, ca a débloquer, et j'ai donc créer mon propre type de base de données(beaucoup plus complexe que ca) et voici le résultat. :

Avec une base de données access, mon fichier de 300 items (ainsi que leur détails) faisait environ 81.5Mo
avec mon format, j'obtient une base de donnée 100000x plus simple a utiliser, 100000x plus rapide, et plus légere... 61Ko !!!

Encore une fois merci !

Phyyl
0
Pouvez vous me donner des informations concernant votre démarche ?

Merci
0
Rejoignez-nous