Gå til innhold

*LØST* JSP - Variabeldeklarasjon i sann if-setning i metode gir "Udefinert variabel"


Anbefalte innlegg

Hei.

Holder på med noen JavaServer Pages-øvinger, men har fått litt trøbbel når jeg forsøker å jobbe med variabler i metodene jeg lager.

Eksempel:

 

<%@ page language="java" %>
<%!
int heltall() {
int i = 1;
if (i == i) {
	int a = 2;
	}
return a;
}
%>
<%
%>

 

Det jeg ikke forstår her er at jeg får melding om at "a" ikke er en definert variabel, selv om if-setningen er sann og variabelen "a" deklareres i if-setningen. Eneste mulighet jeg ser er at den kvitter seg med variabelen "a" så fort if-setningen er ferdig.

Noen som vet hva jeg gjør feil, og eventuelt hvordan jeg får tatt vare på variablene jeg deklarerer i if-setninger slik at jeg kan returnere de? :)

Endret av Skagen
Lenke til kommentar
Videoannonse
Annonse

Ah! :)

Men tingen er at jeg har 3 metoder for å lage 3 lister (klassisk generateList-metode), og de er i orden da jeg har brukt de tidligere.

Men metoden jeg sliter med heter "gimmeWord(String)" og skal hente ett tilfeldig ord ifra en av disse tre listene basert på hvilket argument jeg gir metoden.

 

Slik ser koden ut så langt (eksl. metodene for listene):

				String gimmeWord(String type) {
				String returnOrd;
				if (type.equals("subjekt")) {
					int random = (int)(30 * Math.random());
					String ord[] = genSubjektListe();
					returnOrd = ord[random];
					return returnOrd;
					}
				if (type.equals("verb")) {
					int random = (int)(30 * Math.random());
					String ord[] = genVerbListe();
					returnOrd = ord[random];
					return returnOrd;
					}
				if (type.equals("tilfeldig")) {
					int random = (int)(30 * Math.random());
					String ord[] = genTilfeldigListe();
					returnOrd = ord[random];
					return returnOrd;
					}
				return returnOrd;	
				}

Men her forteller kompileren meg at Variable returnOrd may not have been initialized.

Hvordan får jeg returnert ordet fra if-setningen ned til metoden og så returnert fra metoden til resten av koden der jeg bruker f.eks String subjekt = gimmeWord(subjekt)?

 

PS. Har deklarert String subjekt = "subjekt" osv.

Endret av Skagen
Lenke til kommentar

Dessuten ville jeg ha laget en enum:

public enum Ordklasser {
  VERB, SUBSTANTIV, TILFELDIG;
}

...

public String gimmeWord(Ordklasser ordklasse) {
  switch (ordklasse) {
  case VERB:
  return genVerbListe()[new Random().nextInt(genVerbListe().size())];
  case SUBSTANTIV:
  return genSubjektListe()[new Random().nextInt(genSubjektListe().size())];
  default:
  return genTilfeldigListe()[new Random().nextInt(genTilfeldigListe().size())];
  }
}

Lenke til kommentar
Du vet at det ikke er anbefalt å bake Java inn i JSPen på den måten?
Nope, har aldri programmert JSP; Anbefaler bare ting fra mitt eget fagfelt, så får vedkommende selv velge å bruke det. Men jeg antar jo at String returnOrd-problemet hans var at han ikke hadde String returnOrd = null;.

 

Hvorfor er det ikke anbefalt å kode Java-style i JSP, da?

Lenke til kommentar
Hvorfor er det ikke anbefalt å kode Java-style i JSP, da?

 

Presentasjon og logikk bør (skal!) holdes separat, JSP'en bør ta seg av presentasjon av data og aldri noe mer. Det er tegn på svært uryddig kode at slik er blandet. Fra et vedlikeholdssynspunkt er scriptlets helt forferdelig, det minker lesbarheten og gjør at koden blir vanskeligere å endre av andre i fremtiden, det gjør det dessuten vanskeligere for rene webdesignere å endre på designet.

 

JSP'en bør med fordel byttes ut med et rent template-lag som feks Freemarker eller slik det er gjort i Django, et web-rammeverk for Python. Hvis man ikke kan bytte ut bør man skrive JSPen som om det var et template-språk. Hold deg unna Java i JSP er min mening (og mange andres!) :)

Lenke til kommentar

Prinsipiellt er jeg helt enig, ikke bland presentasjon og logikk.

 

På den andre siden så har alle template språkene, rammeverkene osv begrensninger på hva du faktisk kan gjøre i presentasjonslaget. - Nettopp for å skille presentasjon og logikk.

 

Til tider vil web-rammeverk gjøre det vanskeligere å forstå hvordan siden er bygget opp. Man får lag på lag på lag med logikk/presentasjon som kan være vanskelig å forstå, fordi det er vanskelig å få den totale oversikten. Du kan også støte på ytelsesproblemer som du ikke hadde støtt på i ren jsp/servlet kode .

 

... Det er ihvertfall mine erfaringer med JSF/Seam. På den andre siden så letter JSF/Seam jobben for utvikleren i 90% av tiden. Da snakker jeg om å korte ned tiden det tar å lage en AJAX basert side med nærmere 90%.

 

For å lære seg basiskonseptene om hvordan en webserver fungerer så fungerer det helt fint å ha logikk i JSP sidene. - men sitter du med en JSP side med 2000 linjer kode så vet du at du har valgt feil verktøy til jobben ;)

Lenke til kommentar
Men her forteller kompileren meg at Variable returnOrd may not have been initialized.

 

Du får den meldingen fordi det er jo ikke sikkert at noen av disse if setningene slår til. Du må ha en else også som slår inn hvis noen av de andre ikke gjør det. Du bør bruke if, if else og else.

 

Ørjan...

Lenke til kommentar

Takk for alle svar. :)

Jeg leverte øvinga nå nettopp, og har funnet ut litt av hvert hvorfor jeg ikke fikk det til å fungere.

Grunnen til at jeg fikk beskjed om at streng-variabler ikke var initierte var fordi jeg ikke hadde brukt:

 

String stringnavn = new String();

 

Jeg ble også fortalt av min danske IT-lærer at det er god skikk å deklarere alle variabler man skal returnere først, utenfor kontroll-strukturer, og heller bare oppdatere de etterhvert. Ønsker man å returnere fra f.eks en if-setning må man også huske å bruke return null; på slutten av metoden slik pdgx påpekte. :)

Endret av Skagen
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...