28. januar 2007 - 18:24Der 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.
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
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...
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.
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
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)
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...
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.
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
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...
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
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?
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.
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?
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?
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.
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
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
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...
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 ?
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 ;)
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?
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...
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.
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
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
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.