Le filepointer
est bloqué à un point résultant en un StackOverflowError
. Pouvez-vous me montrer ce qui ne va pas ici? L'erreur est exactement: java.lang.StackOverflowError
StackOverflowError dans la recherche binaire récursive dans le fichier java
Je cherche à trouver l'emplacement car la largeur d'enregistrement n'est pas fixée.
Voici le morceau de code:
private static void binarySearch(RandomAccessFile raf, String searchvalue, Long low, Long high) throws IOException
{
Long middle = (low + high)/2;
Long mreal = null;
if(low > raf.length() -1 || high > raf.length()-1 || low >= high) {
System.out.println("Element not found:"); return ;
}
StringBuilder sb = new StringBuilder();
for(long filePointer = middle; filePointer != -1; filePointer--) {
raf.seek(filePointer);
int readByte = raf.readByte();
if(readByte == 0xA) {
break;
}
sb.append((char)readByte);
}
String lastLine = sb.reverse().toString();
System.out.println(lastLine);
mreal = raf.getFilePointer();
String str = raf.readLine();
System.out.println(str);
String values[] = str.split("\t",-1);
int compared = searchvalue.compareTo(values[fieldindex]);
System.out.println(fieldindex);
if(compared == 0) {
System.out.println("Value found. The other details:");
for(int i=0; i < values.length;i++)
System.out.print("\t" + values[i]);
return;
} else if(compared < 0)
binarySearch(raf,searchvalue,low,mreal-1);
else if(compared > 0)
binarySearch(raf,searchvalue,mreal,high);
}
Trace de la pile:
Exception dans le thread "principal" java.lang.StackOverflowError
>at java.util.regex.Pattern$Node.<init>(Pattern.java:2993)
>at java.util.regex.Pattern$CharProperty.<init>(Pattern.java:3332)
>at java.util.regex.Pattern$CharProperty.<init>(Pattern.java:3332)
>at java.util.regex.Pattern$BmpCharProperty.<init>(Pattern.java:3363)
>at java.util.regex.Pattern$BmpCharProperty.<init>(Pattern.java:3363)
>at java.util.regex.Pattern$Single.<init>(Pattern.java:3391)
>at java.util.regex.Pattern.newSingle(Pattern.java:2951)
>at java.util.regex.Pattern.atom(Pattern.java:1985)
>at java.util.regex.Pattern.sequence(Pattern.java:1885)
>at java.util.regex.Pattern.expr(Pattern.java:1752)
>at java.util.regex.Pattern.compile(Pattern.java:1460)
>at java.util.regex.Pattern.<init>(Pattern.java:1133)
>at java.util.regex.Pattern.compile(Pattern.java:823)
>at java.lang.String.split(String.java:2292)
erreur est Stackoverflow lorsque vous exécutez dans un infini boucle ou condition et le programme ne peut pas allouer plus de mémoire sur la pile pour cela. – Srinivas
Essayez le débogueur. Ou écrivez de petits tests à des fonctionnalités plus petites. Dans la forme actuelle, la question est 'trop localisée' – Jayan
Quelle est la trace de pile de l'exception? –