/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Fejl ved en .substring() ... hvorfor?
Fra : Laurids.mj@gmail.com


Dato : 07-07-05 22:08

Hej...

Jeg prøver at løse denne opgave: "Skriv et program, der undersøger,
om en tekst er et palindrom, dvs. med samme stavelse forfra og bagfra."
Men der når jeg prøver at udføre programmet får jeg følgende
fejlmeddelelse:

"Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: -1
at java.lang.String.substring(Unknown Source)
at Opgave346_6.main(Opgave346_6.java:20)"

Min kildetekst kommer her:


//Et program der undersøger, om en tekst er et palindrom.

public class Opgave346_6
{
   public static void main(String[] arg)
   {
      String s1, s2, s3, s4;
      s1 = "regninger";
      s2 = "russerdressur"; //s2 har jeg ikke brugt til noget endnu.
      int n1 = 0;
      int n2 = 0;
      int n3 = s1.length();
      int n4 = 1;
      boolean x1 = false;
      while (n2 <= s1.length())
      {
         s3 = s1.substring(n3-n4, n3-n2);
         s4 = s1.substring(n1+n2, n1+n4);
         if (s3.equals(s4))
            x1 = true;
         else
            x1 = false;
         n2++;
         n4++;
      }
      if (x1 = true)
         System.out.println(s1+" er et palindrom.");
      else
         System.out.println(s1+" er ikke et palindrom.");
   }
}


 
 
Laurids.mj@gmail.com (07-07-2005)
Kommentar
Fra : Laurids.mj@gmail.com


Dato : 07-07-05 22:14

Og forresten - glemte jeg lige at skrive - vil jeg være taknemmelig
hvis I kunne finde fejlen og forklare mig den...
Mvh. Laurids.


Johnnie Hougaard Nie~ (07-07-2005)
Kommentar
Fra : Johnnie Hougaard Nie~


Dato : 07-07-05 23:08

Laurids.mj@gmail.com wrote:
> "Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
> String index out of range: -1

Tjah, n4 kan blive større end n3, og så bliver substring start pos
negativ.....

Skrivebordstest med s1 = "a" kan anbefales!

/Johnnie

Kasper G. Christense~ (07-07-2005)
Kommentar
Fra : Kasper G. Christense~


Dato : 07-07-05 22:59

> Jeg prøver at løse denne opgave: "Skriv et program, der undersøger,
> om en tekst er et palindrom,

Det ville måske være til hjælp (især for dig selv), hvis du prøvede at
forklare grundprincippet i hvordan dette skal undersøges. Jeg forstår
ikke umiddelbart din algoritme, men har nu heller ikke brugt megen tid
på at se på den. Den virker umiddelbart ret besværlig!

> "Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
> String index out of range: -1

Siger vel næsten sig selv: Du prøver at få fat i tegn nr -1 i en string.
Det kan man selvsagt ikke.

> at java.lang.String.substring(Unknown Source)
> at Opgave346_6.main(Opgave346_6.java:20)"

Det er altså i din linie 20 (har du udeladt et par blanke linier i det
du har sendt her?).

Men her er det vigtige:

>       int n1 = 0;
>       int n2 = 0;
>       int n3 = s1.length();
>       int n4 = 1;
>       boolean x1 = false;
>       while (n2 <= s1.length())
>       {
>          s3 = s1.substring(n3-n4, n3-n2);

Jeg tror det er ovenståender der er galt ^^^^^

>          s4 = s1.substring(n1+n2, n1+n4);
>          if (s3.equals(s4))
>             x1 = true;
>          else
>             x1 = false;
>          n2++;
>          n4++;
>       }

Du initialiserer n3 til strengens længde og n4 til 1. Så gentager du din
while-løkke idet sidste gennemløb er når n2 er strengens længde. Da n2
er initialiseret til 0 og da n4 og n2 tælles op samtidigt, vil n4 i
sidste gennemløb være stregens længde +1. Dette trækker du fra n3
(strengens længde) og får derfor -1. Det er ikke en gyldig position i
strengen, hvorfor du får en exception.

Mvh. Kasper

Flemming Mertz (08-07-2005)
Kommentar
Fra : Flemming Mertz


Dato : 08-07-05 06:54

Hej Laurids

Jeg går næsten ud fra at i har fået at vide at i kun måde bruge String
klassen, for ellers ville det være oplagt at smide din tekst der skal
undersøges ind i enten en StringBuffer eller StringBuilder, og kalde
reverse() på den..

Mvh,
Flemming


<Laurids.mj@gmail.com> skrev i en meddelelse
news:1120770498.701503.286370@g49g2000cwa.googlegroups.com...
Hej...

Jeg prøver at løse denne opgave: "Skriv et program, der undersøger,
om en tekst er et palindrom, dvs. med samme stavelse forfra og bagfra."
Men der når jeg prøver at udføre programmet får jeg følgende
fejlmeddelelse:

"Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: -1
at java.lang.String.substring(Unknown Source)
at Opgave346_6.main(Opgave346_6.java:20)"

Min kildetekst kommer her:


//Et program der undersøger, om en tekst er et palindrom.

public class Opgave346_6
{
public static void main(String[] arg)
{
String s1, s2, s3, s4;
s1 = "regninger";
s2 = "russerdressur"; //s2 har jeg ikke brugt til noget endnu.
int n1 = 0;
int n2 = 0;
int n3 = s1.length();
int n4 = 1;
boolean x1 = false;
while (n2 <= s1.length())
{
s3 = s1.substring(n3-n4, n3-n2);
s4 = s1.substring(n1+n2, n1+n4);
if (s3.equals(s4))
x1 = true;
else
x1 = false;
n2++;
n4++;
}
if (x1 = true)
System.out.println(s1+" er et palindrom.");
else
System.out.println(s1+" er ikke et palindrom.");
}
}



kimtiede@gmail.com (08-07-2005)
Kommentar
Fra : kimtiede@gmail.com


Dato : 08-07-05 09:48

Laurids.mj@gmail.com wrote:
> Hej...
>
> Jeg prøver at løse denne opgave: "Skriv et program, der undersøger,
> om en tekst er et palindrom, dvs. med samme stavelse forfra og bagfra."
> Men der når jeg prøver at udføre programmet får jeg følgende
> fejlmeddelelse:
>

Jeg vil mene, at du kan løse dit problem bedre hvis du anvender en
rekursiv metode... Altså fx starte med at undersøge om start og slut af
strengen er ens og derefter bevæge dig en frem i begge ender og lave
samme sammenligning. Hvis de ikke er ens er der ikke tale om et
palindrom - hvis de er ens kan du ende med en situation, hvor der er nul
eller en karakter tilbage. I begge tilfælde er der tale om et palindrom.

Du kan med fordel prøve at håndkøre din algoritme og følge med i, hvad
der sker i variablerne.

Bedste hilsener

Kim Tiedemann

Laurids.mj@gmail.com (08-07-2005)
Kommentar
Fra : Laurids.mj@gmail.com


Dato : 08-07-05 14:09

Da jeg kiggede alle svarende igennem, og derefter kiggede min
kildetekst igennem opdagede jeg selv ret hurtigt fejlen. Fejlen var, at
i stedet for "while (n2 <= s1.length())" skulle jeg have skrevet "while
(n4 <= s1.length())".

Da jeg rettede fejlen fik jeg ingen fejlmeddelelse, men til gengæld
stod der "... er et palindrom" ligegyldig om jeg havde stavet
"regninger" rigtig eller om jeg havde skrevet "reninger" uden "g"
.... (jeg ved ikke hvorfor; måske var det noget med at x1 ikke kunne
finde ud af at skifte til og fra "true" og "false"?)

Derfor ændrede jeg programmet til at bruge "continue" eller "break"
sammen med nogle "if-statements". Nu virker programmet helt efter
hensigten, dvs., at den nu rent faktisk kan kende forskel på palindrom
eller ikke-palindrom

Jeg sender lige kildeteksten med, så I kan se den:
--------------------------------------------------------------------------------------
//Et program der undersøger, om en tekst er et palindrom.

public class Opgave346_6
{
   public static void main(String[] arg)
   {
      String s1, s2, s3, s4;
      s1 = "regninger";
      s2 = "russerdressur"; //s2 har jeg ikke brugt til noget.
      int n1 = 0;
      int n2 = 0;
      int n3 = s1.length();
      int n4 = 1;
      while (n4 <= s1.length())
      {
         s3 = s1.substring(n3-n4, n3-n2);
         s4 = s1.substring(n1+n2, n1+n4);
         n2++;
         n4++;
         if (s3.equals(s4))
            continue;
         else
            break;
      }
      if (n4 == s1.length()+1)
         System.out.println(s1+" er et palindrom.");
      else
         System.out.println(s1+" er ikke et palindrom.");
   }
}
----------------------------------------------------------------------------------------
Som I kan se har jeg ændret den lidt, men hovedsagen er, at den virker
nu...

Kasper G. Christensen: "Det ville måske være til hjælp (især for
dig selv), hvis du prøvede at forklare grundprincippet i hvordan dette
skal undersøges."
Svar: Jeg havde faktisk tænkt det hele igennem og forstået det, inden
jeg spurgte om hjælp, men ellers godt råd

Flemming Mertz: "Jeg går næsten ud fra at i har fået at vide at i
kun måde bruge String klassen, for ellers ville det være oplagt at
smide din tekst der skal undersøges ind i enten en StringBuffer eller
StringBuilder, og kalde
reverse() på den..."
Svar: Faktisk går jeg ikke på noget kursus og har heller ingen
lærer; jeg prøver bare at lære mig selv java... Jeg har derfor lånt
en bog der hedder "Objektorienteret programmering i JAVA" af Jacob
Nordfalk. I bogen er der i hvert kapitel nogle opgaver, som man selv
skal lave. Denne opgave stod før der kom noget om StringBuilder - så
derfor... Men jeg er faktisk lige kommet til afsnittet om
StringBuilder, så jeg tror, at jeg vil prøve at lave det samme
program vha. den.

Mange tak for svarene!
Mvh. Laurids.


Filip Larsen (08-07-2005)
Kommentar
Fra : Filip Larsen


Dato : 08-07-05 14:49

Laurids skrev

Da jeg rettede fejlen fik jeg ingen fejlmeddelelse, men til gengæld
stod der "... er et palindrom" ligegyldig om jeg havde stavet
"regninger" rigtig eller om jeg havde skrevet "reninger" uden "g"

Brug == til at sammenligne med i stedet for =.


Mvh,
--
Filip Larsen



Laurids (08-07-2005)
Kommentar
Fra : Laurids


Dato : 08-07-05 14:19

Hmmm... Den kildetekst kom sku til at se lidt rodet ud :S
Men jeg regner med, at I godt nogenlunde kan gennemskue, hvad det er,
jeg har tænkt.

--
Laurids


Thorbjoern Ravn Ande~ (08-07-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 08-07-05 14:37

"Laurids" <Laurids.mj@gmail.com> writes:

> Hmmm... Den kildetekst kom sku til at se lidt rodet ud :S

Hvis du synes det er der nok også andre der synes det.

Så er det en rigtig god øvelse at få den gjort mindre rodet (og stadig
bevare funktionaliteten).

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Laurids (08-07-2005)
Kommentar
Fra : Laurids


Dato : 08-07-05 14:54

Det jeg mente var nu bare, at det kom til at se rodet ud, da jeg
postede meddelelsen.... Sandsynligvis fordi nogle af linjerne var for
lange, sådan at det hele blev rykket.

I min egen kildetekst er det meget overskueligt; jeg bruger også et
tekst-editor-program der hedder jEdit som gør det endnu nemmere at
gøre det overskueligt... Men igen; ellers godt råd

Mvh. Laurids


Christian Bohr-Halli~ (08-07-2005)
Kommentar
Fra : Christian Bohr-Halli~


Dato : 08-07-05 15:52

"Laurids" <Laurids.mj@gmail.com> posting:

>Det jeg mente var nu bare, at det kom til at se rodet ud, da jeg
>postede meddelelsen.... Sandsynligvis fordi nogle af linjerne var for

Jeg synes nu også, koden ser lidt rodet ud ellers . Dels er
variabelnavnene ikke så sigende, og dels synes jeg umiddelbart, der
er mange nx'er

Et andet og måske mindre rodet bud kunne være (hvis vi holder os til
den ikke-rekursive tilgang):

String txt = "ada";
int start = 0;
int slut = txt.length()-1;
boolean erPan = true;
         
while(slut > start ){
if( txt.charAt(start) != txt.charAt(slut) ){
erPan = false;
start = slut; // stoppe while
}
start++;
slut--;
}
System.out.println(txt + (erPan ? " er pa." : " er ikke pa"));

--
What is life, except excuse for death,
or death, but an escape from life. -Ukendt

----===== http://www.better-browser.info =====----

Bertel Lund Hansen (08-07-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 08-07-05 17:59

Christian Bohr-Halling skrev:

> Et andet og måske mindre rodet bud kunne være (hvis vi holder os til
> den ikke-rekursive tilgang):

Løkken kan faktisk koges ned til:

   while (erPan && slut>start )
      erPan=txt.charAt(start++) == txt.charAt(slut--);

--
Bertel
http://bertel.lundhansen.dk/   Fiduso: http://fiduso.dk/

Thorbjoern Ravn Ande~ (08-07-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 08-07-05 20:00

Bertel Lund Hansen <nospamfilius@lundhansen.dk> writes:

> Løkken kan faktisk koges ned til:
>
>    while (erPan && slut>start )
>       erPan=txt.charAt(start++) == txt.charAt(slut--);

Sun's Java Code Conventions siger at man bør putte tuborgparanteser om
while-kroppen:

http://java.sun.com/docs/codeconv/html/CodeConventions.doc6.html#460

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Laurids (08-07-2005)
Kommentar
Fra : Laurids


Dato : 08-07-05 15:04

Filip Larsen skrev:

Da jeg rettede fejlen fik jeg ingen fejlmeddelelse, men til gengæld
stod der "... er et palindrom" ligegyldig om jeg havde stavet
"regninger" rigtig eller om jeg havde skrevet "reninger" uden "g

"

Brug == til at sammenligne med i stedet for =.

Svar: Nååårh ja! Der var fejlen... Godt set :D

--
Laurids


Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409074
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste