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 :

Le probleme classique: Object reference not set to an instance of an object.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Par défaut Le probleme classique: Object reference not set to an instance of an object.
    Bonjour,

    J'ai cette erreur classique lorsque je click sur le bouton btnFitToScreen: "Object reference not set to an instance of an object." (NullReferenceException was unhandled)
    Et toujours le meme conseil: "Use the 'New' keyword to create an object instance."

    Je crois que je comprends le probleme, mais je ne sais pas comment le resoudre. Dans ma classe cdtPosterBase, l'Image est vide ("Nothing"), donc evidemment la propriete "m_OriginalImage.Width" n'a rien. Je pense qu'il y a peut-etre un probleme de declaration de variable ou purement un probleme de POO.

    Bref, si quelqu'un peut me dire ou se trouve le probleme, je serais ravi.

    J'ai simplifie le code de facon a pointer sur le probleme rencontre.

    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
     
    Public Class Form1
        Private cdtPB As cdtPosterBase
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' Create a PictureBox (pbDemo) as cdtPosterBase
            Dim pbDemo As New PictureBox
            pbDemo.Image = My.Resources.Serge
            Me.SplitContainer.Panel2.Controls.Add(pbDemo)
            ' Assign pbDemo to the class cdtPictureBox 
            cdtPB = New cdtPosterBase(pbDemo)
        End Sub
     
        Private Sub btnFitToScreen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFitToScreen.Click
            cdtPB.FitToScreen()
        End Sub
    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
     
    Imports System.Drawing.Imaging
     
    Public Class cdtPosterBase
        Inherits PictureBox
     
        Public Shadows Property Image() As System.Drawing.Image
            Get
                Return m_OriginalImage
            End Get
            Set(ByVal Value As System.Drawing.Image)
                Dim r As New Rectangle(0, 0, Value.Width, Value.Height)
                m_OriginalImage = New Bitmap(Value)
                m_OriginalImage = DirectCast(m_OriginalImage.Clone(r, Imaging.PixelFormat.Format32bppPArgb), Bitmap)
                Me.Invalidate()
            End Set
        End Property
     
        Public Sub FitToScreen()
            Me.Origin = New Point(0, 0)
            ZoomFactor = Math.Min(ClientSize.Width / m_OriginalImage.Width, ClientSize.Height / m_OriginalImage.Height) ' MESSAGE D'ERREUR !
        End Sub
    Autre point important ou pas, ce probleme est aussi arrive depuis que j'ai voulu ajoute un ContextMenu dans la "Public Sub New" (voir ci-dessous).

    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
     
        Public WithEvents pbBase As PictureBox
        Private oCtxMenu As New ContextMenuStrip
        Private oToolStripItem1 As New ToolStripMenuItem
        Private oToolStripItem2 As New ToolStripMenuItem
     
        Public Sub New(ByVal cPictureBox As PictureBox)
            pbBase = cPictureBox
            oToolStripItem1.Text = "Info"
            AddHandler oToolStripItem1.Click, AddressOf ContextMenuHandler1_Click
            oCtxMenu.Items.Add(oToolStripItem1)
            ' IN SHORT=> oCtxMenu.Items.Add("Info", New System.EventHandler(AddressOf Me.ContextMenuHandler1_Click))
            oToolStripItem2.Text = "Delete"
            AddHandler oToolStripItem2.Click, AddressOf ContextMenuHandler2_Click
            oCtxMenu.Items.Add(oToolStripItem2)
            pbBase.ContextMenuStrip = oCtxMenu
        End Sub
    Bref, je dois faire quelquechose de travers (probleme de comprehension en POO?).

    Merci,
    JLuc01

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    si monObjet est null (ou Nothing en VB) alors monObject.attribut n'est pas seulement null ou vide, il est purement et simplement inaccessible et tenter d'y accéder lève la fameuse exception dont tu parles. Avant d'attaquer les attributs ou les méthodes d'un objet il faut donc vérifier que l'objet existe bien.

    Bon dev.

  3. #3
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Deux choses qu'il FAUT savoir.

    1) Tu n'attrapes pas les Exceptions.... Try Catch etc....
    Du coup, si dans ton constructeur par exemple, il y a une erreur, il va sortir de la fonction, ne va pas finir ce qu'il fait, voir va générer des trucs bizarres... ça peut même bloquer ton PC... Bref, gestion d'erreur.

    2) Tu peux trouver toi même d'où vient l'erreur... en 1 min, si si !!!
    Et tu utiliseras cette méthode toute ta vie d'informaticien, alors commence maintenant :
    -> tu mets un point d'arrêt sur la première ligne de ton constructeur. (tu cliques sur la marge, à gauche de la ligne en question, ça fait apparaître un point rouge) Le code va s'y arrêter quand il va y arriver.
    -> Puis en faisant F10 tu vas faire avancer le code, ligne par ligne : Le pas-à-pas.
    -> tu peux mêmes cliquer sur F11, pour rentrer dans les sous-méthodes.
    Et ainsi, tu va trouver LA ligne qui bug et corriger le problème.

  4. #4
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Je sais pas pour .NET mais en C avec VS suffit de lancer en mode debug, sans point d'arrêt, l'exécution s'arrêtera d'elle-même sur la ligne causant l'erreur. Ensuite en se baladant dans la pile d'appels (les contextes sont chargés à la volée) on peut retrouve pas mal de bugs sans trop de souci.

  5. #5
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Ca devrait, mais il faut souvent le paramétrer (je sais pas comment c'est par défaut)

    On peut même faire apparaître les "First Chance Exception" avant qu'elles n'arrivent.

    Pour configurer tout ça, suffit d'aller de sélectionner dans le Menu : Debug/Exceptions et cocher les bonnes cases.

  6. #6
    Membre confirmé
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Par défaut
    Bonsoir,

    Et merci pour les commentaires, mais pour l'instant, cela ne m'aide pas beaucoup.

    En premier, j'avais essaye de declarer ma variable avec le mot New: Private cdtPB As New cdtPosterBase, mais sans succes.
    Ainsi, je pensais que je pouvais l'utiliser dans toutes mes Sub. Et non, l'erreur est toujours la.

    jopopmk: Oui, l'objet ne doit pas etre declarer correctement. Je pense avoir compris ce probleme, mais je ne vois pas mon erreur. Je sais ou elle pose probleme: ligne 21 de "Public Class cdtPosterBase". Et bien sur, si l'objet n'est pas declare, tout ce qui depend de cet objet n'est pas accessible.

    mactwist69: Des Try Catch, j'en utilise de temps en temps, mais, probablement pas assez. Cependant, apres votre suggestion, j'ai mis un Try Catch dans le constructeur, comme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Sub New(ByVal cPictureBox As PictureBox)
            Try
                pbBase = cPictureBox
                ...etc...    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    End Sub
    Mais, en testant un point d'arret a different endroit, j'ai remarque, que cela ne passe meme pas dans ce constructeur, mais dans le "Sub New()" de base (default).
    Le mode Debug, je connais, meme si je n'utilise probablement pas son plein potentiel. Pour moi, comprendre les messages d'erreur, c'est aussi tout un art que je ne maitrise pas.

    Bref, soit l'erreur saute aux yeux (mais pas aux miens), soit je ne sais pas trop???
    Peut-on avoir ces 2 lignes ensemble? "Inherits PictureBox" ET "Public Sub New(ByVal cPictureBox As PictureBox)" ou bien je m'egare.

    Le seul indice que je retiens, c'est de chercher du cote du constructeur. Mais, je crois encore que le probleme vient de la declaration de mes variables.
    Bref (encore), je patauge...

    JLuc01

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/04/2008, 18h36
  2. new : Object reference not set to an instance of an object
    Par zulad dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/06/2007, 20h35
  3. Object reference not set to an instance of an object
    Par DjRusty dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/03/2007, 07h26
  4. Réponses: 1
    Dernier message: 28/12/2006, 11h05
  5. Réponses: 1
    Dernier message: 20/04/2006, 12h09

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