0

filepointerStackOverflowError이되는 지점에서 멈추게됩니다. 여기서 정확히 틀린 점을 가르쳐 주시겠습니까? 오류는 정확히 다음과 같습니다. java.lang.StackOverflowErrorJava에서 파일의 재귀 적 이진 검색에서 StackOverflowError

레코드 폭이 고정되어 있지 않기 때문에 위치를 찾기 위해 노력하고 있습니다.

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); 
} 

스택 추적 : 여기

코드의 조각 실에서

예외 "주"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) 
+1

유래 오류가 루프 또는 조건이 발생하여 프로그램이 더 많은 메모리를 스택에 할당 할 수 없습니다. – Srinivas

+1

디버거를 사용해보십시오. 또는 작은 기능에 작은 테스트를 작성하십시오. 현재 양식에서 질문이 '너무 현지화되었습니다' – Jayan

+0

예외의 스택 추적은 무엇입니까? –

답변

0
else if(compared > 0) 
    binarySearch(raf,searchvalue,mreal,high); 

mreal해야한다 + 1.

또한 재귀는 과도한 바이너리 검색입니다 .... 일반적으로 루프가 빠릅니다.

롤프

편집 :

확인 ====, 그래서 그것은 여전히 ​​작동하지 않습니다. 내가 부분적으로 만했기 때문입니다. 나는 잠시 동안 코드를보고 문제를 보았지만 잘못된 값으로 고정시켰다.

1을 추가하는 대신 비교 한 문자열에 줄 수를 추가해야합니다 (줄 수있는 경우 줄 수 ...).

이 모든 것이 나에게 말해주는 것은 아마도 숙제 일 수도 있고 재귀 연습과 이진 검색 연구 일 수도 있습니다.

숙제를하지 않고서는 코드를 비판하는 순간을 보냅니다.

이진 검색은 중간 지점을 찾은 다음 중간 지점이 일치하는 경우 반환하고, 검색보다 클 경우 반환하고, 중간 지점보다 먼저 검색하고, 그렇지 않으면 중간 지점을 검색합니다.

귀하의 코드는 '오른쪽'과 '이전'오른쪽이지만, '이후'는 검색하지 않습니다 ... '이후'부분을 계산하지 않으므로 코드가 중간에 생성됩니다. 첫 번째 문자 뒤의 전체 문자열을 '뒤에서'지정하십시오. 고쳐. readLine()을 사용한다는 것은 라인 종결자를 알지 못한다는 것을 의미합니다 ('\ r \ n'또는 '\ n'입니까?). '중간'지점 다음에 루프를 사용하는 것이 좋습니다. 그리고 필요할 때마다 '후'검색의 위치를 ​​계산하기 위해 다른 +1에 도달 할 때까지 앞으로 걸어 들어 와서 (+1) 사용하는 것이 좋습니다.

일부 다른 의견 ....

  • 는 '오토 박싱'를 사용하지 마십시오. Long 객체 대신 long 프리미티브를 사용하십시오.
  • getFilePointer()가 반환하는 값이 'filepointer'변수에 이미 정의되어있는 경우 왜 getFilePointer()를 호출해야합니까?
  • '중간'을 계산하고, 사용 낮은 + 높은 >>> 1 .... 그것은 당신의 강사를 감명을 받고 읽은 후이 왜 당신이 알고 말할 수있다 : http://googleresearch.blogspot.ca/2006/06/extra-extra-read-all-about-it-nearly.html
  • 당신이 것을 읽고있는 동안, 당신을 루프에서 이진 탐색을하는 것이 재귀에서 수행하는 것보다 나은 이유를 알 수 있습니다.
  • 재귀를 사용하는 경우 매개 변수를 '최종'으로 설정해야합니다. 그러면 스택에 차지하는 공간이 줄어들고 '더 깊게'갈 수 있습니다. 당신이 사용 재귀을 경우
  • , 당신은 당신이 StringBuilders처럼 ... 당신의 방법에서 만든 객체 ....

롤프을 최소화해야

당신이 무한으로 실행할 때
+0

방금 ​​변경했습니다. 그러나 같은 문제. –

+0

대답의 편집 – rolfl

+0

빠른 질문 하나 : str = raf.readLine();을 할 때이 문 다음에 파일 포인터가 가리키는 곳은 어디입니까? 현재 줄의 끝이나 새 줄의 시작? –

관련 문제