Avatar billede poloen Nybegynder
17. februar 2012 - 14:39 Der er 8 kommentarer og
1 løsning

StringIndexOutOfBoundsException

Hej Eksperten.

Jeg har en  kode paa omkring 300 linjer som laeser en fil og tjekker for nogle noegleord i teksten.
Den burden saavidt jeg kan se virke efter hensigten.
Dog er naar koden koeres sker der en StringIndexOutOfBoundsException.
Den fejl sker, mens filen bliver laest i en while loekke, hvor den String som den er gal med ogsaa for tilegnet sin vaerdi.
Gaeldende linjer ser saaledes ud:


String fileInfo = new String();
StringBuffer buffRText = new StringBuffer(fileInfo)
StringBuffer myFileString[] = new StringBuffer[1000000];
StringBuffer absFileLineString =  new StringBuffer();
String absFileLineSmallSubstring = new String();

int incrChecker2 = 0;

myFile = new File(args[0]);
newFile = new File(args[1]);

BufferedReader myBuffR = new BufferedReader(new FileReader(myFile));

while ((fileInfo = myBuffR.readLine()) != null) {
    myFileString[incrChecker2] = buffRText;
    incrChecker2 = incrChecker2 + 1;
}
myBuffR.close();
incrChecker2 = 0;
fileInfo = null;

// fejlen sker her
absFileLineSmallSubstring = absFileLineString.substring(0, 2);


Haaber der er nogen som kan hjaelpe.
Avatar billede poloen Nybegynder
17. februar 2012 - 14:58 #1
bah mig og min maade at fremlaegge dele af en kode paa.. Her kommer den med alle inkluderede data.

String fileInfo = new String();
StringBuffer buffRText = new StringBuffer(fileInfo);
StringBuffer myFileString[] = new StringBuffer[1000000];
StringBuffer absFileLineString =  new StringBuffer();
String absFileLineSubstring = new String();
int absFileLineSubstringInt = 0;
String absFileLineSmallSubstring = new String();
int incrFileLineCheck = 0;

myFile = new File(args[0]);

BufferedReader myBuffR = new BufferedReader(new FileReader(myFile));

while ((fileInfo = myBuffR.readLine()) != null) {
    myFileString[incrChecker2] = buffRText;
    incrChecker2 = incrChecker2 + 1;
}
myBuffR.close();
incrChecker2 = 0;
fileInfo = null;

for (incrFileLineCheck = 0; incrFileLineCheck <= myFileString.length; incrFileLineCheck++) {

    absFileLineString = myFileString[incrFileLineCheck];
    absFileLineSubstringInt = absFileLineString.indexOf(absJavaKeywordString, incrFileLineCheck);

    absFileLineSubstring = absFileLineString.substring(absFileLineSubstringInt, absFileLineString.length());

    // fejlen sker her
    absFileLineSmallSubstring = absFileLineSubstring.substring(0, 2);
}
Avatar billede arne_v Ekspert
17. februar 2012 - 15:01 #2
absFileLineSubstring indeholder mindre end 2 tegn
Avatar billede poloen Nybegynder
17. februar 2012 - 15:48 #3
Mistaenker at myFileString bliver nulstillet, efter while loekken er faerdig & at det er grunden til at absFileString referer til data som er null.
Jeg er dog ikke helt sikker.
Avatar billede Slettet bruger
17. februar 2012 - 20:28 #4
Hvis den var null, ville du få en NullPointerException. Den eneste måde du kan få den fejl, er som arne allerede har kommenteret.
Avatar billede poloen Nybegynder
18. februar 2012 - 22:20 #5
Fejlen ligger åbenbart i, at de første 30-40 gange myBuffR læser en linje, er den null.
Selvom der filen som bliver læst har bogstaver skrevet, er myBuffR/myFileString null.

Jeg har lavet nogle control flow statements, som tjekker om pågældende nummer i myFileString[] er null.
Så nu bliver filen læst & skrevet uden fejl-meddelser.

Selvom fejlen på en måde er rettet, har jeg ikke rettet roden til problemet om man så må sige.
Jeg håber der er en som kan.
Avatar billede Slettet bruger
18. februar 2012 - 23:20 #6
Den viste kode giver ikke mening. I din while-loop læser du en linje ind i fileInfo, men du bruger den ikke til noget. Og for hver linje du læser, sætter du et index i myFileString til at pege på den samme buffRText.

I stedet for at lave et array med plads til 1000000 elementer, ville det være bedre at bruge ArrayList.

Jeg ser i øvrigt ingen grund til du bruger StringBuffers i dit kode eksempel, da du ville kunne klare dig med Strings.

Din for-loop løber alle 1000000 elementer igennem, og med mindre du har læst 1000000 linjer ind i myFileString fra din fil, så vil de sidste være null.

Din brug af indexOf giver heller ikke mening, da du sætter den til at søge fra index incrFileLineCheck. Jeg ville tro dette var grunden til du fik StringIndexOutOfBoundsException.

Måske ville du kunne klare dig uden en for-loop, og nøjes med din while-loop uden at skulle indlæse hele filen i myFileString, men det kommer nok an på hvad formålet med din kode er.
Avatar billede poloen Nybegynder
19. februar 2012 - 00:18 #7
Jeg vil gerne foretrække for for-loop frem for while-loop, ellers bruger jeg bare en incrFileLineCheck++ ved slutningen af loop'en.

koden er ændret til, at indexOf tjekker nuværende linje med en for-loop.

Der er nu en while-loop, som læser hver linje i filen, & en tæller som stiger for hver linje, så myFileString har nu en størrelse på filens antal linjer.

Der bruges StringBuffers da den læste filen skal redigeres med StringBuffer.add/replace.

Jeg vil tage et kig på ArrayList ad dagene.
Avatar billede poloen Nybegynder
20. november 2012 - 13:22 #8
Hej Eksperten.
Undskyld for inaktiviteten, men vil gerne give points til arne da svaret er rigtigt.
Jeg har ikke koden længere og kan derfor ikke finde løsningen på problemet.
Avatar billede arne_v Ekspert
24. november 2012 - 04:06 #9
svar
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