Avatar billede dingemann Novice
28. januar 2007 - 18:24 Der er 35 kommentarer og
1 løsning

VB.NET > NullPointerException ved Sessions

her er koden


        With HttpContext.Current
            If Not (.Session("memStampSession")) <> Nothing Then
                memStamp = .Session("memStampSession").ToString()
            Else
                .Session.Add("memStampSession", "her er noget tekst")
            End If
        End With
        stamp = memStamp



Hvorfor fanden får jeg en NullPointerException - "Object reference not set to an instance of an object." ved

If Not (.Session("memStampSession")) <> Nothing Then


?

Jeg har smidt hele projektet op til download hvis nogne skulle være interesseret i mere kode... http://www.dnup.dk/merekode.zip (kig i Upload.vb)

Det er ret svært at debugge en så intetsigende fejl men hvis nogen vil ha mere kode så paster jeg gerne mere ind her. Jeg er ved at blive skør af at arbejde med Sessions der ikke virker.
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 18:33 #1
Husk altid option strict og option explicit. Du mener nok:

    If Not (.Session("memStampSession") <> Nothing) Then
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 18:34 #2
Men du skal vel ikke have en "Not" på ... ??
Avatar billede dingemann Novice
28. januar 2007 - 18:58 #3
jeg tror ikke det gør den store forskel - det er en mindre detalje med NOT osv - pointen er at uanset hvordan jeg leger med .Session så får jeg altid en fejl - prøv evt at hente koden som jeg har smidt ud via linket oven over
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:00 #4
Nej, jeg gider ikke hente din kode ;)
Hvis du flytter parentesen som anført, hvor går det så galt henne.
"Not" eller "ikke Not" plejer nu at gøre en forskel...
Avatar billede dingemann Novice
28. januar 2007 - 19:07 #5
men det gør det ikke her... stadig samme fejl. Fejlen opstår også hvis jeg skriver

tissemand = httpcontext.current.session("peter")
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:08 #6
Afvikler du koden under ASP.NET ?
Avatar billede dingemann Novice
28. januar 2007 - 19:08 #7
note:
jeg har siddet hele dagen og rodet med det, vendt det på hovedet og tilbage igen... jeg har prøvet alt og jeg tvivler på at det er selve den konkrete kode den er gal med - jeg er sikker på at det er 'omstændighederne' den er gal med men jeg aner ikke hvad jeg gør galt og hvad jeg skal gøre. Fejlen siger intet om mulige løsningsmodeller.
Avatar billede dingemann Novice
28. januar 2007 - 19:09 #8
ja... - under ASP.NET - koden er i en class til et multiple-file upload-site med Flash-integration.
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:14 #9
Nej, fejlen behøver heller ikke sige mere. Ved at debugge, eller lave testudskrifter, finder man jo ud af hvad der er null/nothing. Dit eksempel fra 19:07:00 kunne tyde på at HttpContext.Current er nothing
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:18 #10
Men der er normalt ingen grund til at bruge den kringlede omvej omkring HttpContext.Current. Det kan sagtens være en bedre idé at tage sessions-objektet med som parameter - det er også den nemmeste måde at kunne lave en aftestning af en klasse (unittest)
Avatar billede dingemann Novice
28. januar 2007 - 19:19 #11
men som du kan se kan jeg ikke engang tjekke om den er nothing uden at få fejlen... hvis jeg da bare kunne tjekke på den så ville det være et halvt skridt. Det var iøvrigt præcis det min kode af 19:07:00 var lavet for - for at se om jeg overhovedet kunne tjekke på den...
Avatar billede dingemann Novice
28. januar 2007 - 19:22 #12
i mit tilfælde skal der helst skrives til sessionen fra klassen af.
At bruge sessions i det her projekt er en lidt skæv løsning men den eneste mulighed. Pointen er at jeg skal ha gemt en værdi fra selvsamme klasse så næste gang klassen loades skal jeg bruge værdien igen. Og jeg kunne kun komme på sessions som en mulig løsning på dette problem. Værdien skal der både skrives og hentes fra, fra klassen selv.
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:23 #13
Men så skal du ikke sige ".session".  Og et test på nothing skal jo også lige være:

  if HttpContext.Current is nothing then
    //et eller andet..

Men kan du køre debug på den? Starter du separate tråde?  Hvad med at tage sessions-objektet med som parameter?
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:25 #14
Og har asp.net siden selv haft gang i noget med session, og dermed oprettet et session-objekt, inden du kalder metoder i din klasse?
Avatar billede dingemann Novice
28. januar 2007 - 19:32 #15
jaja - altså igen: den konkrete kode er ligegyldig - jeg har bare sat With foran nu for at se om jeg kunne huske at bruge With (har ikke brugt den siden vb5 og ville lige se om den stadigvæk fandtes)

Og nej! der har ikke været nogle sessions før - det her er første omgang sessions og de oprettes først (class'en køres først) når der klikkes på en Flash-knap
Avatar billede dingemann Novice
28. januar 2007 - 19:33 #16
Men så skal du ikke sige ".session". 


altså jeg er ikke helt tabt bag en vogn - jeg har intelliSense aktiveret og jeg kender til røde bølgelinjer som angiver at min kode ikke virker... ingen problem der. Jeg har prøvet at programmere før...
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 19:40 #17
Men så er det jo nemt at se sætte et breakpoint og se hvad HttpContext.Current er.
De røde bølgelinier siger bare om der er syntaksfejl, ikke om koden virker.
Det kunne da gøre en forskel om den .aspx side, der kalder din klasse, har haft gang i håndsvinget og startet sessionsmaskineriet op. Bare en

  session("vivilsaa")="gernehaveensession"

...eller hvad du nu synes.... ;)
Avatar billede dingemann Novice
28. januar 2007 - 20:27 #18
jeg prøver lige at smide en session ude i default.aspx og ser hvad der sker
Avatar billede dingemann Novice
28. januar 2007 - 20:30 #19
jeg får stadigvæk samme fejl fra class'en selvom jeg har smidt din <%Session("vivilsaa")="gernehaveensession"%> ind i default.aspx

:)

Jeg har aldrig, selvom jeg burde, rodet med breakpoints - så det bliver lidt on-the-side men det jeg gør er at sætte en rød klat ude i siden der hvor jeg kan se NullPointException opstår og hvad kigger jeg så efter når den breaker?
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 20:40 #20
Lidt afhængig af hvad det nu er du bruger som udviklingsvæktøj, men prøv at markere med musen: HttpContext.Current  hold markøren over, og se hvad den siger. Du kan også stoppe lidt før det sted det sker, og så tage en sætning af gangen.
Avatar billede dingemann Novice
28. januar 2007 - 21:52 #21
altså jeg bruger VS2005 Team Edt.
Jeg får intet ud af at holde musen over httpcontext.current - det er jo heller ikke en værdig der gir noget - er det ikke de sessions der er under den der er mere vigtige?

httpcontext.current giver ikke noget
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 22:08 #22
Jeg kan nok ikke give dig synderlig hjælp med debugger på afstand. Du kan også lave en Quickwatch for at se indholdet af variabler.

Og ellers er der jo rådet fra for lang tid siden: overfør sessions-objektet fra .aspx-siden i en parameter, og drop brugen af httpcontext.current
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 22:08 #23
"httpcontext.current giver ikke noget" - den skal sige "nothing", hvis den er nothing.
Avatar billede dingemann Novice
28. januar 2007 - 22:18 #24
okay - this is the way:

1) jeg sætter et breakpoint ved det sted i koden hvor jeg ved den 'crasher' med en NullPointException, så den ikke når at køre koden der fåkker den

2) jeg starter solutionen, laver nødvendig interaktion, og den breaker hvor den skal

3) den er breaket og hvad gør jeg så?

Når jeg er nået til punkt 3 har jeg kigget i 'Autos' hvor jeg kan ekspandere og se variablers værdier. Og for at minimere forvirringen så har jeg smidt et screendump - http://www.dnup.dk/trutterut.jpg -

er det ikke httpcontext.current.session der skal kigges på fremfor httpcontext.current?
Avatar billede erikjacobsen Ekspert
28. januar 2007 - 22:34 #25
Jamen, så er du så langt, at du kan se, at httpcontext.current ikke er nothing.
Derfor kan indholdet af en session-variabel godt være nothing. Når du debugger, og måske alligevel, kan du bruge den gamle "Owicky-Gries"-metode: læg værdien ud i en variabel, så du nemmere kan se med debuggeren hvad den er:

    dim memStampSession as string = cstr(session("memStampSession"))

Derefter husk at teste med "is" når du tester for "nothing", som tidligere anført.
Avatar billede dingemann Novice
29. januar 2007 - 09:29 #26
det skal jo ikke være nogen hemmelighed at jeg havde prøvet lignede til det du forslår med

Dim memStampSession As String = CStr(HttpContext.Current.Session("memStampSession"))


... men af mit gode hjerte forsøger jeg igen og får følgende fejl
NullReferenceException was unhandled by user code - Object reference not set to an instance of an object.

Præcis den samme fejl som før. Igen, igen igen: jeg tror ikke det er min brug af koden den er gal med, det må være omstændighederne den bruges i/under der går gal
Avatar billede erikjacobsen Ekspert
29. januar 2007 - 10:02 #27
Så gør vi da bare  (der findes et nemmere hack, men her står hvad der sker)

Dim memStampSession As String
if HttpContext.Current.Session("memStampSession") is nothing then
  memStampSession = ""
else
  memStampSession = CStr(HttpContext.Current.Session("memStampSession"))
end if
Avatar billede dingemann Novice
29. januar 2007 - 10:29 #28
altså, hør nu her. Og det er slet ikke for at være næsvis eller noget, men du kommer ikke længere ved at vende og dreje den kodestump - der vil A L T I D opstå den samme fejl. Jeg fik samme fejl igen. Jeg tror, jeg tror, efterhånden at den httpcontext.current volder problemer andre steder - jeg forstiller mig en stor rød knap jeg har glemt at trykke på et andet sted i koden, eller situationer hvor sessions slet ikke kan bruges... hvad ved jeg - jeg ikke længere bare tror, at vi ikke kommer længere med koden, men jeg ved at fejlen skal findes et andet sted...
Avatar billede dingemann Novice
29. januar 2007 - 10:49 #29
har du nogen bud? - jeg har været i web.config for at slå sessions (enablesessionstate = true) - eller sådan noget i den stil) - men det hjalp heller ikke... er der andet ?
Avatar billede erikjacobsen Ekspert
29. januar 2007 - 10:52 #30
Hvis du i debuggeren ser at HttpContext.Current indeholder noget, så er der som sådan ikke noget galt i opsætningen. Derfor er mit bud at du skal kigge på koden. (Eller droppe HttpContext.Current og overføre sessions-objektet til funktionerne i klassen)

Men hvis du ikke vil prøve at ændre i koden, så er det fint med mig ;)
Avatar billede dingemann Novice
29. januar 2007 - 11:07 #31
hvad mener du helt præcist med httpContext.Current skal indeholde noget - det er jo ikke en dims der indeholder noget i sig selv - og viser mit screendump http://www.dnup.dk/trutterut.jpg ikke at den ikke indeholder noget?
Avatar billede dingemann Novice
29. januar 2007 - 11:13 #32
fortæl mig hvordan jeg finder ud af om httpContext.Current indeholder noget :)
Det der med at holde musen over er ikke en mulighed - jeg får intet ud af det ihvertfald...
Avatar billede erikjacobsen Ekspert
29. januar 2007 - 17:39 #33
httpContext.Current indeholder vel de felter, der står under linien med Current i dit jpg-billede.
Jeg kan ikke se hvad du præcis gør i hvilken sammenhæng, men det ser ud til at du har trykket på de rigtige knapper. Derfor fokuserer jeg på at komme videre (løse problemet, eller blot finde årsagen) vha kode.
Avatar billede dingemann Novice
29. januar 2007 - 21:18 #34
okay - jamen måske tager jeg også fejl - jeg har bare brugt over 7 timer på at få samme fejl uanset hvordan jeg vendte koden - for mig er det efterhånden der hvor jeg overvejer om jeg mangler at gøre noget andet. Alternativet er stadigvæk at du kan hente solutionen - alle filerne ligger som de skal bruges - du skal bare trykke F5 vælge en fil (eller to) til upload (som så ender i Uploadmappen - hvis det virkede)... trykke upload og så får du din NullReferenceException.

Men det er selvf. helt iorden hvis du ikke vil - jeg tvivler bare på progression ved at blive ved med at vende den samme kode om - jeg tror der skal noget andet til et andet sted
Avatar billede dingemann Novice
30. januar 2007 - 13:36 #35
ehm - jeg har debugget mig frem til at det har betydning at hele class'en har betydning for hvorvidt sessions er brugbare...
Derfor hele class'en som følger:
Det har tilsyneladende noget at skulle ha sagt at der er en Implements med.

Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls
Imports System.IO
Public tis As String

Public Class Upload
    Implements IHttpHandler
    Dim dirMerged As String
    Dim stamp As String
    Dim timeStamp As New timeStamp
    Dim sessionMem As New sessionMem
   

    Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest

        If sessionMem.sessionMem("timeMem") = "" Then
            sessionMem.sessionMem("timeMem") = timeStamp.timeReturner
        Else

        End If

        stamp = sessionMem.sessionMem("timeMem")
        If context.Request.Files.Count > 0 Then
            Dim tempFile As String = context.Request.PhysicalApplicationPath
            Dim j As Integer
            For j = 0 To context.Request.Files.Count - 1 Step j + 1
                Dim uploadFile As HttpPostedFile = context.Request.Files(j)
                If uploadFile.ContentLength > 0 Then
                    Try
                        If Directory.Exists(stamp) Then
                            MsgBox("That path exists already.")
                            Return
                        End If
                        Directory.SetCurrentDirectory(HttpContext.Current.Server.MapPath("..") & "\Upload\")
                        Directory.CreateDirectory(stamp)
                        dirMerged = HttpContext.Current.Server.MapPath("..") & "\Upload\" & stamp & "\\"
                        uploadFile.SaveAs(String.Format("{0}{1}", dirMerged, uploadFile.FileName))
                    Catch e As Exception
                        MsgBox("The process failed: " & e.ToString())
                    End Try
                End If
            Next
        End If
        HttpContext.Current.Response.Write(" ")
    End Sub
End Class
Avatar billede dingemann Novice
17. februar 2007 - 10:05 #36
jeg lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester