2010-09-06 25 views
7

Tôi có một log file chứa dữ liệu sau nextLine() và hasNextLine():Vấn đề sử dụng các phương pháp Scanner

Shortest đường dẫn (2) :: RV3280-RV0973C-RV2888C
con đường ngắn nhất (1): : RV3280-RV2502C
đường dẫn (2) :: RV3280-RV2501C-RV1263
con đường ngắn nhất (2) :: RV2363-Rv3285-RV3280

Từ mỗi dòng, tôi yêu cầu số lượng trong phạm vi khung, tên ngắn nhất của protein đầu tiên (RV3280 trong dòng đầu tiên) và tên của protein cuối cùng (RV2888C trong dòng đầu tiên).

Tôi đã viết mã cho điều này bằng cách sử dụng đối tượng Scanner.

try{ 
       Scanner s = new Scanner(new File(args[0])); 
       while (s.hasNextLine()) { 
        s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern 
        MatchResult result = s.match(); // results from 
        for (int i=1; i<=result.groupCount(); i++) { 
         System.out.println(result.group(i)); 
        } 
        s.nextLine(); // line no. 29 
       } 
       s.close(); 
     } 

     catch (FileNotFoundException e) { 
      System.out.print("cannot find file"); 
     } 

Tôi nhận được kết quả mong muốn nhưng tôi cũng nhận được thông báo lỗi. Đầu ra tôi nhận được cho tệp đầu vào ở trên là:

Exception in thread "main" java.util.NoSuchElementException: No line found 
     at java.util.Scanner.nextLine(Scanner.java:1516) 
     at nearnessindex.Main.main(Main.java:29) 
2 
RV3280 
RV2888C 
1 
RV3280 
RV2502C 
2 
RV3280 
RV1263 
2 
RV2363 
RV3280 
Java Result: 1 
BUILD SUCCESSFUL (total time: 1 second) 

Tại sao lỗi này xảy ra và cách sửa lỗi?

Trả lời

3

Dữ liệu đầu vào của bạn có thể không kết thúc bằng dấu phân cách. Các cuộc gọi tới findInLine sẽ chuyển Máy quét qua mẫu phù hợp và nếu bạn đang ở cuối dữ liệu đầu vào khi gọi nextLine, nó sẽ ném NoSuchElementException

Sửa lỗi dễ dàng mà không cần sắp xếp lại mã nhiều sẽ là kết thúc trong khi vòng lặp với:

if (s.hasNextLine()) { 
    s.nextLine(); 
} 
+0

Hi Key, có nó hoạt động ngay sau khi thêm một dấu phân cách dòng. Tôi không nghĩ đến việc di chuyển Máy quét đến cuối dòng :) Cảm ơn bạn rất nhiều và cảm ơn bạn đã khắc phục. – Harish

0
public static void main(String[] args) { 
      Scanner s = new Scanner("Shortest path(2)::RV3280-RV0973C-RV2888C" 
        + "\nShortest path(1)::RV3280-RV2502C" 
        + "\nShortest path(2)::RV3280-RV2501C-RV1263" 
        + "\nShortest path(2)::RV2363-Rv3285-RV3280"); 
      while (s.hasNextLine()) { 
       s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern 
       MatchResult result = s.match(); // results from 
       for (int i = 1; i <= result.groupCount(); i++) { 
        System.out.println(result.group(i)); 
       } 
       s.nextLine(); // line no. 29 
      } 
      s.close(); 
    } 
} 

run: 
2 
RV3280 
RV2888C 
1 
RV3280 
RV2502C 
2 
RV3280 
RV1263 
2 
RV2363 
RV3280 
BUILD SUCCESSFUL (total time: 0 seconds) 

Điều này phù hợp với tôi, có thể bạn có một số ký tự lạ hoặc dòng trống trong tệp của mình?

2 dòng trống ở cuối cho tôi rằng: ngoại lệ trong chủ đề java.lang.IllegalStateException "chính": Không có kết quả phù hợp sẵn

Nếu tập tin đầu vào của bạn được rằng đúng định dạng, bạn có thể làm một cái gì đó như thế , đó là cách dễ dàng hơn bởi vì bạn có thể loại bỏ regex khó chịu đó;)

String[] lines = new String[]{"Shortest path(2)::RV3280-RV0973C-RV2888C", "Shortest path(1)::RV3280-RV2502C", "Shortest path(2)::RV3280-RV2501C-RV1263", "Shortest path(2)::RV2363-Rv3285-RV3280", "\n", "\n"}; 
    final int positionOfIndex = 14; 
    final int startPositionOfProteins = 18; 
    for (String line : lines) { 
     if (!line.trim().isEmpty()) { 
      System.out.print(line.charAt(positionOfIndex) + ": "); 
      String[] proteins = line.substring(startPositionOfProteins).split("-"); 
      System.out.println(proteins[0] + " " + proteins[proteins.size() -1]); 

     } 
    } 
+0

2 dòng trống cuối cùng cho "Không có kết quả phù hợp" làm dòng trống đầu tiên được chọn cho các kết quả phù hợp. Mã của bạn không thoát khỏi regex "khó chịu" nhưng những gì tôi cần chỉ là protein đầu tiên và cuối cùng, không phải là danh sách đầy đủ. Cảm ơn anyway dù che chắn, có lẽ tôi có thể sử dụng điều này ở một nơi khác. – Harish

+0

sry didnt thấy rằng .. tôi đã thay đổi một dòng, nên làm việc ngay bây giờ. – atamanroman

+0

hmm ... ya bây giờ nó sẽ hoạt động. – Harish

Các vấn đề liên quan