[VB.Net] NullReferenceEx bij aanroep functie

Pagina: 1
Acties:

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
Hey mensen, hoe is tie

Ik ben aan het werk met een pocketpc app in vs.net 2003.

Mijn databaseclass heeft een logfile functie, waar het nu om gaat. De eerste aanroep van WriteInLog werkt wel ("db exists") maar de 2e aanroep ("dbconnectionstring set") levert een nullreferenceexception op. Als ik die probeer te vangen in een try... catch block krijg ik die exception al op het try statement.

Wie kan me helpen?

Visual Basic .NET:
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
Public Class database
        Implements IDisposable
        Dim dbName As String
        Dim dbConn As SqlCeConnection
        Dim dbLog As String
        Private Shared sr As StreamWriter
        Dim fs As FileStream

        Public Sub New()
            'dbLog = WTReg.Main.myConfig.GetSetting("dblog")
            dbLog = ".\dblog.txt"

            If File.Exists(dbLog) Then
                File.Delete(dbLog)
            End If

            fs = New FileStream(dbLog, FileMode.Append, FileAccess.Write)
            sr = New StreamWriter(fs)

            ' dbName = WTReg.Main.myConfig.GetSetting("dbfile")
            dbName = ".\testdb.sdf"
            If Not File.Exists(dbName) Then
                WriteInLog("dbfile doesn't exist, creating...")
                Dim engine As New SqlCeEngine("Data Source=" & dbName)
                Try
                    engine.CreateDatabase()
                    WriteInLog("dbfile Created")
                Catch
                    WriteInLog("ERROR creating dbfile")
                Finally
                    engine = Nothing
                End Try
            Else
                WriteInLog("dbfile exists")
            End If
            dbConn.ConnectionString = "Data Source=" & dbName

            WriteInLog("dbconnectionstring set")

        End Sub

        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            sr.Close()
            sr = Nothing
            fs = Nothing
        End Sub

        Private Shared Function WriteInLog(ByVal myEvent As String)
            sr.WriteLine(myEvent)
            sr.Flush()
        End Function

    End Class

[ Voor 16% gewijzigd door Y3PP3R op 28-01-2006 14:05 . Reden: updated code tag ]


  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 08:32

Rhapsody

In Metal We Trust

controleer eens d.m.v. breakpoints wat sr en fs zijn wanneer de functie WriteInLog wordt aangeroepen.

🇪🇺 pro Europa!


  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
breakpoint regel 33:
code:
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
-   sr  {System.IO.StreamWriter}    System.IO.StreamWriter
    AutoFlush   False   Boolean
-   BaseStream  {System.IO.FileStream}  System.IO.Stream
-   [System.IO.FileStream]  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  0   Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    0   Long
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    Length  0   Long
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    0   Long
+   Encoding    {System.Text.UTF8Encoding}  System.Text.Encoding
+   FormatProvider  {System.Globalization.CultureInfo}  System.IFormatProvider
    NewLine "
"   String
+   Null    {System.IO.StreamWriter}    System.IO.StreamWriter

-   fs  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  0   Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    0   Long


breakpoint regel 34:
code:
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
-   sr  {System.IO.StreamWriter}    System.IO.StreamWriter
    AutoFlush   False   Boolean
-   BaseStream  {System.IO.FileStream}  System.IO.Stream
-   [System.IO.FileStream]  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  0   Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    0   Long
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    Length  0   Long
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    0   Long
+   Encoding    {System.Text.UTF8Encoding}  System.Text.Encoding
+   FormatProvider  {System.Globalization.CultureInfo}  System.IFormatProvider
    NewLine "
"   String
+   Null    {System.IO.StreamWriter}    System.IO.StreamWriter

-   fs  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  0   Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    0   Long


breakpoint regel 36:
code:
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
-   sr  {System.IO.StreamWriter}    System.IO.StreamWriter
    AutoFlush   False   Boolean
-   BaseStream  {System.IO.FileStream}  System.IO.Stream
-   [System.IO.FileStream]  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  15  Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    15  Long
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    Length  15  Long
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    15  Long
+   Encoding    {System.Text.UTF8Encoding}  System.Text.Encoding
+   FormatProvider  {System.Globalization.CultureInfo}  System.IFormatProvider
    NewLine "
"   String
+   Null    {System.IO.StreamWriter}    System.IO.StreamWriter

-   fs  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  15  Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    15  Long


breakpoint regel 38 na error en break:
code:
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
-   sr  {System.IO.StreamWriter}    System.IO.StreamWriter
    AutoFlush   False   Boolean
-   BaseStream  {System.IO.FileStream}  System.IO.Stream
-   [System.IO.FileStream]  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  15  Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    15  Long
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    Length  15  Long
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    15  Long
+   Encoding    {System.Text.UTF8Encoding}  System.Text.Encoding
+   FormatProvider  {System.Globalization.CultureInfo}  System.IFormatProvider
    NewLine "
"   String
+   Null    {System.IO.StreamWriter}    System.IO.StreamWriter

-   fs  {System.IO.FileStream}  System.IO.FileStream
    CanRead False   Boolean
    CanSeek True    Boolean
    CanWrite    True    Boolean
    IsAsync False   Boolean
    Length  15  Long
    Name    "\dblog.txt"    String
+   Null    {System.IO.Stream.NullStream}   System.IO.Stream
    Position    15  Long
+   fs.Null {System.IO.Stream.NullStream}   System.IO.Stream
    {System.IO.StreamWriter}    Expression expected.


Helpt dat?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:35

Creepy

Tactical Espionage Splatterer

Het is dan natuurlijk weer niet de bedoeling dat je hier wat zaken dumpt en verwacht dat wij voor je gaan debuggen en dat weet je ondertussen ook wel ;)

Door zelf stap voor stap door de code heen te lopen en te controleren welke variabelen welke inhoud hebben zou je zelf moeten kunnen achterhalen wat er mis gaat. Dus wat heb je nu zelf al gevonden? Heb je uberhaupt al een idee wat er misgaat en waarom?

Zie ook P&W FAQ - Leer **** debuggen!!

[ Voor 5% gewijzigd door Creepy op 28-01-2006 15:43 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:29
Is het niet slimmer om alleen een FileReader object aan te maken in jouw WriteInLog methode? Nu houdt je constant een file resource open, ook als je bijvoorbeeld deze klasse later in je applicatie helemaal niet meer gebruikt. Je hebt nu de reader.Close in je Dispose methode. Maar je weet nooit wanneer de GAC eens een keertje langs komt fietsen.

Dus gewoon in je WriteInLog (Pseude-code):

Begin WriteInLog
FileStream fs = New FileStream(dbLog, FileMode.Append, FileAccess.Write)
StreamWrite sw = New StreamWrite()
//doe hier een stukje naar een file schrijven
fs.Close()
sw.Close()
fs = Nothing
sw = Nothing
End WriteInLog

[ Voor 6% gewijzigd door Sybr_E-N op 28-01-2006 15:42 ]


  • peke
  • Registratie: Februari 2002
  • Laatst online: 15-02 19:28
En waarom staat die streamwriter shared? :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 14-04 20:38
Als je een null-reference exception hebt, wil dat zeggen dat je ergens een stuk geheugen uitleest, dat niet gealloceerd is.
Wat je dus moet doen, is, zoals Creepy al zegt, debuggen. Gebruik breakpoints, gebruikt F10 en F11 om regel per regel uit te voeren (step over / step into) en ga na op welke regel het precies fout loopt. Als je dat weet, bekijk je wat je niet gealloceerd hebt. (wat is er null ? ).

Waarom je die streamwriter shared gemaakt hebt, is me ook een raadsel. Die moet je trouwens ook niet in je Dispose gaan closen. Roep close aan als je 'm niet meer nodig hebt. (Close van een FileStream doet ook een dispose van die stream trouwens).
Je hebt nu de reader.Close in je Dispose methode. Maar je weet nooit wanneer de GAC eens een keertje langs komt fietsen.
De dispose method moet je eigenlijk zelf aanroepen. Het is de finalizer die door de GAC wordt uitgevoerd, en, eigenlijk moet je je class zodanig maken dat de finalizer ook de dispose aanroept, mocht dat nodig zijn / Nog niet gebeurd zijn.
Dispose wordt niet automatisch door de GAC aangeroepen. Check het Dispose pattern voor meer info.

[ Voor 10% gewijzigd door whoami op 28-01-2006 20:22 ]

https://fgheysels.github.io/


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:29
whoami schreef op zaterdag 28 januari 2006 @ 20:17:
De dispose method moet je eigenlijk zelf aanroepen. Het is de finalizer die door de GAC wordt uitgevoerd, en, eigenlijk moet je je class zodanig maken dat de finalizer ook de dispose aanroept, mocht dat nodig zijn / Nog niet gebeurd zijn.
Dispose wordt niet automatisch door de GAC aangeroepen. Check het Dispose pattern voor meer info.
Owja, )nu je het zegt. 8)7 Ik wist het ook wel, ben nog daar nog druk mee bezig geweest, over hoe .NET nou wat en waneer opruimt. En wat/waneer je zelf dient te doen, in verband met performance issues en het aanleren wat best practices. (/me mentalnote: eerst denken, dan posten)

[ Voor 15% gewijzigd door Sybr_E-N op 28-01-2006 20:29 ]


  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
als eerste wil ik niet overkomen dat ik het jullie laat uitvoeren, zoals de eerste reactie na de dumps suggereert. Ik heb al geprobeerd stap voor stap te doen en hij loopt vast op de tweede aanroep naar writeinlog, en als ik try catch block er om zet, dan loopt hij vast op try, of in iedergeval, dat highlight hij. Nu denk ik bij een NullReferenceException aan dat ik ergens het New statement heb vergeten, maar dat is niet het geval, of wel? Dus het zal iets met de toestand van de streamwriter zijn en daar kom ik niet uit, in welke toestand die verkeerd, want die informatie uit het watchwindow zegt me niets.

En dan waarom ik de functie shared heb: ik dacht, dat als ik meerdere instances van mn class aanmaak, dat ze dan allemaal in het zelfde logbestand schrijven? maar heb het nog nie getest omdat ik hier al tegenaan loop.

En dan over de dispose, en finalize, en wanneer ik de stream close: ik heb er niet genoeg verstand van om te beoordelen wat effectiever is, telkens streamwriter aanmaken en sluiten, of aanmaken, telkens regel schrijven en aan het einde pas sluiten. En ik ben aan het lezen over wanneer finalize en dispose worden aangeroepen, maar de documentatie in de msdn daarover is mij niet 100% duidelijk.

[ Voor 3% gewijzigd door Y3PP3R op 28-01-2006 20:46 . Reden: foutje weggeharkt ]


  • peke
  • Registratie: Februari 2002
  • Laatst online: 15-02 19:28
Met de debugger van VS moet dat een eitje zijn om te vinden.
Ik zie daar sw.flush staan, wat doet dit juist?

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
flush schrijft de wijzigingen naar de onderliggende stream, anders doet hij dat op close.. maar de link naar het debug topic hierboven werkt, maar de link die daar in staat werkt niet, als iemand nog een tip heeft waar ik eens kan kijken, ik houd me aanbevolen.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Zit er wel iets in dbConn bij de volgende regel?
Visual Basic:
36
            dbConn.ConnectionString = "Data Source=" & dbName

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 07-02 17:11
@Daos... das een hele goede... inderdaad loopt hij daar op vast... Ik dacht dat breakpoints aan het eind van de regel code stopten, maar ze stoppen voor hij wordt uitgevoerd...
Dus mijn eigen conclusie, NullRef = geen new statement klopte... waar dbconn wordt gedimt even new ingevoegd en t werkt. Dank je, dom foutje...

Maar ik blijf nog mijn volgende vraag houden:
Op welke manier is het het meest resource effectief om de streamwriter te openen en sluiten?

  • whoami
  • Registratie: December 2000
  • Laatst online: 14-04 20:38
Open je writer van zodra je iets moet schrijven. Hou 'm open als je weet dat je 'm 'binnenkort' nog nodig zult hebben, en sluit 'm van zodra je 'm niet meer nodig hebt.
(Sluit 'm dus niet iedere keer als je één regeltje hebt weggeschreven. Als je binnen één procedure een aantal keren moet wegschrijven naar een file, hou je 'm gewoon open).

https://fgheysels.github.io/

Pagina: 1