phuonglh/vn.vitk

Lỗi chương trình chạy mãi, ko bắn ra exception

supercatmai opened this issue · 1 comments

Em chào thầy,
Em có sử dụng thư viện thầy viết cho việc tách từ, khi em tách từ một văn bản thì chương trình cứ chạy mãi, ko có exception nào hay thông tin log gì ở màn hình. Em debug thì biết được dòng văn bản làm cho chương trình như vậy là đoạn string này: "Sinh ngày…………… tháng…………… năm ....................................................................".
Mong thầy sớm khắc phục lỗi này ạ !
Em cảm ơn thầy!

Hi em,

Cảm ơn em đã thông báo lỗi. Mình đã kiểm tra nguyên nhân lỗi thì thấy chương trình bị lặp vô hạn khi xử lí chuỗi toàn ký tự chấm ở sau chữ "năm".

Điều thú vị là bản thân chương trình không có lỗi, mà có thể do một bug của thư viện Java khi xử lí biểu thức chính quy với các kí tự Unicode sau:

([\p{Lu}\.]+)([\p{Lu}\.]+)*[^\p{Ll}\)\W]

Em có thể tự kiểm tra bằng một đoạn mã Java đơn giản so khớp chuỗi toàn dấu chấm ở trên như sau:

        String s = "....................................................................";
        Pattern pattern = Pattern.compile("([\\p{Lu}\\.]+)([\\p{Lu}\\.]+)*[^\\p{Ll}\\)\\W]");
        Matcher matcher = pattern.matcher(s);
        if (matcher.lookingAt()) {
            System.out.println(matcher.start());
        }
        System.out.println("Done.");

Em sẽ thấy chương trình Java này rơi vào vòng lặp vô hạn!

Như vậy, cách khắc phục lỗi này ở đây là phải sửa biểu thức chính quy, không cần sửa mã nguồn gì. Em làm như sau:

  • Mở tệp chứa các biểu thức chính quy của công cụ tokenization, là tệp /export/dat/tok/regexp.txt
  • Thay thế dòng

02:allcaps ([\p{Lu}\.]+)([\p{Lu}\.]+)*[^\p{Ll}\)\W]

bằng dòng

02:allcaps ([A-Z]+)([A-Z\.])*[^a-z\)\W]

Và chạy lại chương trình nhé, khi đó sẽ hết lỗi.

Phương