Scanner.findInLine () 과 while 의 사용이 엉뚱하게 NoSuchElementException: No line found

4418 단어 exception
public static boolean parseHTML(Scanner sc, List<String> errorInfo) {

        String[] tags = new String[DEFAULT_CAPACITY];

        int count = 0; // tag counter

        String token; // token returned by the scanner

        while (sc.hasNextLine()) {

            while ((token = sc.findInLine("<[^>]*>"))!=null) { // find the next tag: starting with a '<', ending with a '>', anything between them are recognized as tag name. Note that '<>' is also taken into account. 

                if (count == tags.length) {

                    tags = Arrays.copyOf(tags, tags.length * 2);

                }

                tags[count++] = stripEnds(token); // strip the ends off this tag

            }

            sc.nextLine();

        }

        return isHTMLMatched(tags, errorInfo);

    }

증상:
while(sc.hasNextLine () 을 통해 마지막 텍스트 처리를 시작하고 sc.nextLine () 으로 실행할 때 예외를 던집니다. NoSuchElementException: No line found
println (sc.hasNextLine () 의 검사를 거쳐 while ((toke = sc.findInLine ("...) 에 들어갑니다!=null) 전에true를 출력하고, 이 순환을 뛰어넘으면false를 출력합니다.
분석:
findInLine의 API Specification을 보십시오. findInLine () 의 nextLine () 기능은 언급하지 않았습니다.
도대체 어떤 원인이 이 문제를 야기했는지 잠시 알 수 없다.
해결 방안: while를 고쳐 씁니다. 다음과 같습니다.
public static boolean parseHTML(Scanner sc, List<String> errorInfo) {

        String[] tags = new String[DEFAULT_CAPACITY];

        int count = 0; // tag counter

        String token; // token returned by the scanner

        while (true) {

            while ((token = sc.findInLine("<[^>]*>"))!=null) { // find the next tag: starting with a '<', ending with a '>', anything between them are recognized as tag name. Note that '<>' is also taken into account, but it's illegal.

                if (count == tags.length) {

                    tags = Arrays.copyOf(tags, tags.length * 2);

                }

                tags[count++] = stripEnds(token); // strip the ends off this tag

            }

            if (sc.hasNextLine()) {

                sc.nextLine();

            } else {

                break;

            }

        }

        return isHTMLMatched(tags, errorInfo);

    }

좋은 웹페이지 즐겨찾기