Avatar billede mercutio Nybegynder
20. august 2002 - 19:21 Der er 21 kommentarer og
1 løsning

Mangler et smart tip for at undgå null pointers...

Hvis man får på sin side skriver
String a = request.getParameter("a");
if(a.equals("b")
{ bla bla
}

Det kan jo ske at folk ikke har fyldt noget ud så der ikke kommer noget ind med b. Hvad gør i så for at undgå at det kan ske? Ligenu sender jeg en hidden value med over hvergang hvor jeg sætter b til "null" men man må da kunne lave noget fikst så den bare siger hvis b er null så er den heller ikke = a...
Måske et dumt spørgsmål men hvad faen =)
Avatar billede thesurfer Nybegynder
20. august 2002 - 19:24 #1
kan man ikke bruge javascript i jsp ?
Avatar billede thesurfer Nybegynder
20. august 2002 - 19:25 #2
if (b != '') {

if(a.eq...)
  {
  bla bla
  }
}

?

/theSurfer.
Avatar billede disky Nybegynder
20. august 2002 - 19:26 #3
brug denne klasse, den klarer de ting helt fint :

/*
* ParameterParser.java
*
* Created on 14. februar 2002, 18:47
*/

package dk.disky.web;

import javax.servlet.http.*;

/**
*
* @author  srr
* @version
*/
public class ParameterParser
{
    private static final String STRING_DEFAULT="TEST";
    private static final int INT_DEFAULT=-1;
    private static final long LONG_DEFAULT=-1;
    private static final float FLOAT_DEFAULT=-1;
    private static final double DOUBLE_DEFAULT=-1;
    private static final boolean BOOLEAN_DEFAULT=false;
   
    // Is private in order to make sure it can not be instantiated
    private ParameterParser()
    {
    }
   
    public static String getString(HttpServletRequest request, String name)
    {
        return getString(request, name,STRING_DEFAULT);
    }

    public static String getString(HttpServletRequest request, String name, String def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
       
        return temp;
    }
   
    public static int getInt(HttpServletRequest request, String name)
    {
        return getInt(request, name, INT_DEFAULT);
    }

    public static int getInt(HttpServletRequest request, String name, int def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
       
        int val=def;
       
        try
        {
            def=Integer.parseInt(temp);
        }
        catch (NumberFormatException e)
        {
        }
        return def;
    }

    public static long getLong(HttpServletRequest request, String name)
    {
        return getLong(request, name, LONG_DEFAULT);
    }

    public static long getLong(HttpServletRequest request, String name, long def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
       
        long val=def;
       
        try
        {
            def=Long.parseLong(temp);
        }
        catch (NumberFormatException e)
        {
        }
        return def;
    }

    public static float getFloat(HttpServletRequest request, String name)
    {
        return getFloat(request, name, FLOAT_DEFAULT);
    }

    public static float getFloat(HttpServletRequest request, String name, float def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
       
        float val=def;
       
        try
        {
            def=Float.parseFloat(temp);
        }
        catch (NumberFormatException e)
        {
        }
        return def;
    }

    public static double getDouble(HttpServletRequest request, String name)
    {
        return getDouble(request, name, DOUBLE_DEFAULT);
    }

    public static double getDouble(HttpServletRequest request, String name, double def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
       
        double val=def;
       
        try
        {
            def=Double.parseDouble(temp);
        }
        catch (NumberFormatException e)
        {
        }
        return def;
    }

    public static boolean getBoolean(HttpServletRequest request, String name)
    {
        return getBoolean(request, name, BOOLEAN_DEFAULT);
    }
   
    public static boolean getBoolean(HttpServletRequest request, String name, boolean def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
        if(temp.equalsIgnoreCase("on") || temp.equalsIgnoreCase("true")) return true;
        return false;
    }
   
}
Avatar billede mercutio Nybegynder
20. august 2002 - 19:28 #4
disky den må du lige fortælle lidt om hvordan fungerer....
Avatar billede disky Nybegynder
20. august 2002 - 19:31 #5
okay
du har denne kode:
String a = request.getParameter("a");
if(a.equals("b"))
{ bla bla
}

som giver nullPointerException hvis 'a' ikke findes.

brug minklasse på følgende måde:
String a = dk.disky.web.ParameterParser.getString(request,"a");
if(a.equals("b")
{ bla bla
}

hvis 'a' ikke findes bliver den sat til indholdet af STRING_DEFAULT.

du kan også bruge den:
String a = dk.disky.web.ParameterParser.getString(request,"a","Default værdien");

Det samme gælder for int,float,double,long,boolean

Jeg blev nemlig selv træt af det samme problem :)
Avatar billede soelvpil Nybegynder
20. august 2002 - 19:33 #6
Den simpleste løsning er:

String a = request.getParameter("a");
if("b".equals(a)
{ bla bla
}
som virker på samme måde som din kode, bortset fra at den ikke går ned, hvis parameteren er null.
Avatar billede disky Nybegynder
20. august 2002 - 19:37 #7
simpel ja, grim ja.
Avatar billede thesurfer Nybegynder
20. august 2002 - 19:40 #8
hvis det virker så....

brugeren ser det jo ikke, vel? :)

/theSurfer.
Avatar billede disky Nybegynder
20. august 2002 - 19:42 #9
korrekt.

Problemmet at det er imod den objektorienterede tangegang at bytte rundt på objekter på den måde.

Det er et hack af dimensioner, og hvis du f.eks. viser det til en eksamen er der store chancer for du får tæv for det.

Hvorimod løsningen med en klasse, giver mulighed for meget mere end det lille hack.

Men det er selvfølgelig smag og behag.
Jeg er personligt hardcore objektorientere, og kan derfor ikke lide dette hack.
Avatar billede soelvpil Nybegynder
20. august 2002 - 19:44 #10
Tja, det er vel en smagssag.

Så vidt jeg kan se, så er koden kortere, og laver nøjagtig det samme, sååååhh
Avatar billede disky Nybegynder
20. august 2002 - 19:46 #11
Det virker ingen tvivl om det, men det er ikke objektorienteret korrekt, og derfor en glidebane at komme ind på.

Husk det er 'a' objektet man ønsker at se om er ligmed "b", og ikke et ny oprettet 'b' objekt.
Avatar billede soelvpil Nybegynder
20. august 2002 - 19:52 #12
hmmm, det kan vist komme ud på et. Faktisk mener jeg koden er mere læselig, hvis man f.eks. har noget halløj med

if ()
{ }
else if()

o.s.v

Jeg er dog enig i at din løsning er bedre, hvis man skal caste til int eller boolean eller noget tredje (men er det så ikke tæt på at være forretnings- og ikke præsentationslogik, som burde være et andet sted?)
Avatar billede disky Nybegynder
20. august 2002 - 20:02 #13
hvis du tænker på hvad der skal være af kode på en JSP side, så skal der slet ikke være noget kode på en JSP side, men kun custom tags, men det er vist lidt udenfor dette spørgsmål.
Avatar billede bearhugx Nybegynder
20. august 2002 - 21:52 #14
Hmm...  Kunne man ikke "bare" gøre følgende

String a = "";
a = request.getParameter("a");
:
:
if(a.equals("b")) {
...
}

----
På den måde er du garanteret et initialiseret objekt (med strengen ""), så derfor kan du ikke få NullPointerException

/Søren Munk Skrøder
Avatar billede soelvpil Nybegynder
20. august 2002 - 22:18 #15
Hmmm, det har du da vist ikke afprøvet i praksis, har du?
Avatar billede bearhugx Nybegynder
20. august 2002 - 23:07 #16
soelvpil ... Nej ... Men hvad er der galt da ... Jeg kan ikke lige se nogen fejl (men jeg er også lidt træt :-)

Måske der skulle bruges
  String a = new String("");
istedet ...

Meningen med eksemplet er, at a-variablen allerede er instantieret inden man tester ( .equals() )
Avatar billede bearhugx Nybegynder
20. august 2002 - 23:12 #17
Disky... Ang. din kode

i metoden
    public static String getString(HttpServletRequest request, String name, String def)
    {
        String temp=request.getParameter(name);
        if(temp==null || temp.equals("")) return def;
       
        return temp;
    }

gider du da lige at forklare mig i hvilke situationer at udtrækning af en parameter fra en request kan give "" (tom streng)...

Så vidt jeg husker, så vil den altid returnere null, hvis der ikke er skrevet nogen værdi
  (as in 'foo.jsp?a=ABC&b=' )
hvor et forsøg på udtræk af parameteren 'b' vil returnere null...
Avatar billede disky Nybegynder
21. august 2002 - 00:08 #18
bearhugx:
Din metode ville også fejle, et String objekt er imutabelt, så getParameter returnerer et nyt objekt, eller helt korrekt manglen på et objekt, nemlig null.

Hmm den med "" kan jeg ikke lige huske hvor er der, jeg synes bare at kunne huske at det kunne opstår, er dog for træt til at tænke lige nu.
Måske har du ret :)
Avatar billede bearhugx Nybegynder
21. august 2002 - 00:15 #19
Hmm... Det har du jo ret i.. Det kan jeg godt se nu :-)

Normalt har jeg plejet at gøre følgende

  String a = req.getParameter("a");
  if(a==null) a="";
  :
  if(a.equals("b")) {
  ...
  }

/Søren
Avatar billede mercutio Nybegynder
21. august 2002 - 00:33 #20
Tak for hjælpen gutter. Disky din klasse er i brug...
Avatar billede disky Nybegynder
21. august 2002 - 08:43 #21
mercutio :-=

bearhugx: Det gjorde jeg også altid indtil jeg blev træt af konstant at skulle skrive samme kode hele tiden :)
Avatar billede soelvpil Nybegynder
21. august 2002 - 16:24 #22
bearhugx:

Så vidt jeg husker, så vil den altid returnere null, hvis der ikke er skrevet nogen værdi
  (as in 'foo.jsp?a=ABC&b=' )
hvor et forsøg på udtræk af parameteren 'b' vil returnere null...

Nu kommer jeg helt i tvivl, men mener faktisk, at i eksemplet vil nogle webcontainere (weblogic5.1) returnere en tom streng, mens andre (oracle og vist nok også tomcat) vil returnere null.
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