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

VB.NET Discussion :

Exception levée par l'initialiseur de type


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Exception levée par l'initialiseur de type
    Bonjour,
    Je travaille depuis quelques mois sur une appli en VB.Net. Jusqu'alors, tout se passait très bien, ça marchait et tout et tout.
    Mais voilà qu'aujourd'hui, mon programme ne fonctionne plus. Voici tous les détails en... détail


    Pour les besoins de l'application, j'ai codé une sorte de base de données, basée sur l'utilisation d'une SortedList, contenant elle-même des ArrayList (indéxées par leur clé dans la SortedList).
    Pour rendre plus facile le développement, j'ai fais une classe "clsBDD". En voici la source (attention, c'est un peu long) :
    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
    Imports System.IO
    Imports System.Collections
    Imports System.Runtime.Serialization.Formatters.Binary
     
     
    Public Class clsBDD
     
        Private Database As SortedList
        Private al As ArrayList
        Private StreamFile As Stream
        Private Serializer As New BinaryFormatter
        Private Enumerator As IDictionaryEnumerator
        Private Fichier As String
     
     
     
        ' // METHODES PUBLIQUES
     
        Public Sub New(ByVal fich As String)
            Database = New SortedList()
            al = New ArrayList
     
            If Not File.Exists(fich) Then
                CreateDirectory(fich)
            End If
            Fichier = fich
     
            LoadFile()
        End Sub
        Private Sub CreateDirectory(ByVal fich As String)
            If IO.Directory.Exists(fich.Substring(0, fich.LastIndexOf("\"))) = False Then
                IO.Directory.CreateDirectory(fich.Substring(0, fich.LastIndexOf("\")))
            End If
     
            If Not File.Exists(fich) Then
                File.WriteAllText(fich, "")
            End If
        End Sub
        Public Sub Add(ByRef sVal As ArrayList)
            Database.Add(GetLastID(), sVal)
        End Sub
     
        Public Property Item(ByVal sKey As String) As Object
            Get
                Return Database.Item(sKey)
            End Get
            Set(ByVal value As Object)
                Database.Item(sKey) = value
            End Set
        End Property
        Public Property Item(ByVal index As Integer) As Object
            Get
                Return Database.Item(Database.GetKey(index))
            End Get
            Set(ByVal value As Object)
                Database.Item(Database.GetKey(index)) = value
            End Set
        End Property
     
        Public ReadOnly Property Count() As Long
            Get
                Count = Database.Count
            End Get
        End Property
        Public Sub Remove(ByVal sKey As String)
            Database.Remove(sKey)
        End Sub
        Public Function GetLastID() As String
            If Database.Count = 0 Then
                Return 0
            End If
     
            Dim nb As Integer = 0
            '' RECUPERATION NOMBRE LE PLUS GRAND
            For i As Integer = 0 To Database.Count - 1
                If nb < Database.GetKey(i) Then nb = Database.GetKey(i)
            Next
            Return nb + 1
        End Function
        Public Function GetidRow(ByVal index As Integer)
            Return Database.GetKey(index)
        End Function
     
        Public Function KeyExists(ByVal sKey As String) As Boolean
            If Database.IndexOfKey(sKey) = -1 Then Return False
            'If Database.IndexOfKey(sKey) = Nothing Then Return False
            Return True
        End Function
     
     
     
        ' // METHODES PRIVEES
        Private Sub LoadFile()
            Try
                StreamFile = File.OpenRead(Fichier)
            Catch
            End Try
     
            If StreamFile.Length > 0 Then
                Database = CType(Serializer.Deserialize(StreamFile), SortedList)
            Else
                Database = New SortedList
            End If
            StreamFile.Close()
        End Sub
        Public Sub Save()
            File.WriteAllText(Fichier, "")
            StreamFile = File.OpenWrite(Fichier)
            Serializer.Serialize(StreamFile, Database)
            StreamFile.Close()
        End Sub
     
    End Class
    Voilà pour le code =)
    L'application est en mode "fenêtre" et j'instancie tous ces objets dans le Sub Form_Load().
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Load_Instances()
            Musics = New clsBDD("Database\Musiques.mrm")
            Categories = New clsBDD("Database\Categories.mrm")
            RotationRules = New clsBDD("Database\RotationsRules.mrm")
            RotationsGrid = New clsBDD("Database\RotationsGrid.mrm")
            RotationEngine = New clsRotation()
            Config = New clsBDD("Database\Config.mrm")
        End Sub
    Tous les objets sont déclarés dans un Module, en Public :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        '' Classes de gestion BDD
        Public Musics As clsBDD
        Public Categories As clsBDD
        Public RotationRules As clsBDD
        Public RotationsGrid As clsBDD
        Public RotationEngine As New clsRotation()
        Public Config As clsBDD
    C'est là que tout va mal. Au débug, voici ce que Visual m'affiche : http://myprogsoft.online.fr/vbfr/ErMRM.png

    La trace d'appels de l'InnerException affiche ceci :
    à My_Radiomatisme_Finale.clsRotation..ctor() dans C:\Documents and Settings\Ted\Mes documents\Visual Studio 2005\Projects\My Radiomatisme Finale\My Radiomatisme Finale\Classes\clsRotation.vb:ligne 37
    à My_Radiomatisme_Finale.modClasses..cctor() dans C:\Documents and Settings\Ted\Mes documents\Visual Studio 2005\Projects\My Radiomatisme Finale\My Radiomatisme Finale\Modules\modClasses.vb:ligne 9

    Je tiens à préciser que si j'instancie directement les objets dans le module ("Public Music As New clsBDD(...)"), ça plante aussi, avec la même erreur.
    Voilà, après de maintes et longues recherche sur Google et tous les forums spécialisés que j'ai pu trouver, j'en viens à demander de l'aide ici.
    Merci à toute âme charitable qui saurait m'apporter un peu d'aide

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Tu utilises dans ton constructeur un objet qui n'a pas encore été initialisé (ou plus généralement, qui est Nothing).
    Fait une exécution pas à pas de ton code à partir de la ligne qui précède celle où ton programme à crashé et vérifie à chaque fois la valeur des variables utilisée par ta fonction.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Justement, tout se passe bien !
    Mon objet "Database" est instancié et pas "Nothing", tout ce qui doit être instancié l'est, toute la partie du "Sub New()" s'éxécute, et lorsque j'en sors, pouf ! l'erreur s'affiche.
    Mais vraiment, tout se passe parfaitement bien (la base de données est chargée dans l'objet "Database", idem pour l'objet "Serializer" et "StreamFile"...).
    Enfin tout est parfait.

    L'erreur n'intervient pas dans la classe, même en pas à pas, mais bel et bien à la sortie du "Sub New()".

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Try
                StreamFile = File.OpenRead(Fichier)
            Catch
            End Try
     
            If StreamFile.Length > 0 Then ...
    Il se passe quoi si File.OpenRead à échoué et que donc StreamFile vaut Nothing ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai corrigé cette méthode.
    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
    Private Sub LoadFile()
            Try
                StreamFile = File.OpenRead(Fichier)
            Catch
            End Try
     
    	If isNothing(StreamFile) Then
    		Database = New SortedList()
    	Else
    	        If StreamFile.Length > 0 Then
    	            Database = CType(Serializer.Deserialize(StreamFile), SortedList)
    	        Else
    	            Database = New SortedList()
    	        End If
    	        StreamFile.Close()
    	End If
        End Sub
    Mais lors de mes tests, "StreamFile" n'était pas "Nothing". Il y avait bel et bien un fichier de chargé, puisque l'objet "Database" prend les valeurs après désérialisation.


    Voici un pas-à-pas du Sub Main() de cette classe :
    1. Instanciation de l'objet "Serializer" => OK
    2. Instanciation de l'objet "Database" => OK
    3. Instanciation de l'objet "al" => OK
    4. Le fichier existe : on ne passe pas par la méthode "CreateDirectory()"
    5. L'attribut "Fichier" prend bien la valeur (celle de la variable "fich" passée en paramètre)
    6. Appel de la méthode "LoadFile()" :
    a. Le Try ... Catch est passé sans exception ; "StreamFile" est instancié "System.IO.FileStream"
    b. "StreamFile" n'est pas "Nothing", on passe dans le premier "Else"
    c. "StreamFile.Length" n'est pas supérieur à 0, on passe dans le second "Else"
    d. réinstanciation de l'attribut "Database" => OK (j'avoue, il est déjà instancié en tout premier dans le Sub Main(), j'aurais pu ne pas mettre de "Else" mais je ne vais pas chambouler tout le code pour ne pas compliquer la tâche)
    e. "StreamFile.Close()" sans encombre
    f. Sortie du Sub LoadFile() sans encombre
    7. Sortie du constructeur sans encombre
    8. Exception levée sur la ligne en screenshot dans mon premier post : "Music = New clsBDD("...")", après que tout se soit bien déroulé

    J'ai bien vérifié un à un les objets créés et utilisés, rien de "Nothing" pouvant générer une NullReferenceException, aucune sortie prématurée de méthode, ni aucune exception à l'intérieur d'une méthode de ma classe :s

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Désolé du double post, mais ça y est : j'ai trouvé le problème !

    Allez, c'est parti pour les explications :
    En fait, j'avais homis, dans le Module où sont déclarés tous mes objets, de retirer un "New RotationEngine()", qui est donc éxécuté avant tout le reste.
    Seulement, le constructeur de la classe "RotationEngine" appelait l'objet "RotationGrid" (de type clsBDD), qui n'était pas encore instancié !

    En tout cas, c'est le Visual qui a semé la confusion, en générant une erreur où il ne fallait pas.
    Merci beaucoup pour votre aide, vous m'avez poussé à revoir toutes mes instanciations, et en plus vous avez trouvé une vérification non faite !
    Encore merci, et à bientôt (enfin... pour aider, pas pour autre chose j'espère ) !

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

Discussions similaires

  1. Réponses: 39
    Dernier message: 15/05/2012, 18h54
  2. Réponses: 2
    Dernier message: 06/04/2012, 14h04
  3. Exception levée par l'initialiseur de type
    Par beretb dans le forum C#
    Réponses: 6
    Dernier message: 04/06/2009, 15h26
  4. Expliciter une exception levée par un objet OLE
    Par Bleuarff dans le forum Windows
    Réponses: 3
    Dernier message: 12/05/2005, 16h10

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