2011-08-26 7 views
23

Tôi có ngoại lệ thời gian chạy trong chương trình của mình trong khi tôi đang đọc tệp qua Máy quét.java.util.NoSuchElementException: Không tìm thấy dòng

java.util.NoSuchElementException: No line found  
    at java.util.Scanner.nextLine(Unknown Source)  
    at Day1.ReadFile.read(ReadFile.java:49) 
    at Day1.ParseTree.main(ParseTree.java:17) 

Mã của tôi là:

while((str=sc.nextLine())!=null){ 
    i=0; 
    if(str.equals("Locations")) 
    { 
     size=4; 
     t=3; 
     str=sc.nextLine(); 
     str=sc.nextLine(); 
    } 
    if(str.equals("Professions")) 
    { 
     size=3; 
     t=2; 
     str=sc.nextLine(); 
     str=sc.nextLine(); 
    } 
    if(str.equals("Individuals")) 
    { 
     size=4; 
     t=4; 
     str=sc.nextLine(); 
     str=sc.nextLine(); 
    } 

int j=0; 
String loc[]=new String[size]; 
while(j<size){ 
    beg=0; 
    end=str.indexOf(','); 
    if(end!=-1){ 
     tmp=str.substring(beg, end); 
     beg=end+2; 
    } 
    if(end==-1) 
    { 
     tmp=str.substring(beg); 
    } 
    if(beg<str.length()) 
     str=str.substring(beg); 
    loc[i]=tmp; 
    i++; 

    if(i==size){ 
     if(t==3) 
     { 
      location.add(loc); 
     } 
     if(t==2) 
     { 
      profession.add(loc); 
     } 
     if(t==4) 
     { 
      individual.add(loc); 
     } 
     i=0; 
    } 
    j++; 
    System.out.print("\n"); 
} 
+1

hãy thử xóa tất cả các khoảng trắng trong mã của bạn ... nó làm tôi căng mắt. Bên cạnh đó, "nhập mã của bạn ở đây", nó trông giống như một bài tập về nhà với tôi lol –

+2

Chào mừng đến với SO. Khi đăng mã, bạn nên cẩn thận định dạng để dễ đọc ... tức là xóa các dòng trống không cần thiết, thụt lề đúng cách. Cũng định dạng stacktrace của bạn thành mã để làm cho nó dễ đọc. Tôi đã sửa định dạng cho bạn. –

+2

Ngoài ra, bạn còn lại phần quan trọng nhất, đó là cách 'sc' được khai báo và mở ra. –

Trả lời

20

với Scanner bạn cần phải kiểm tra nếu có một dòng tiếp theo với hasNextLine()

nên vòng lặp trở thành

while(sc.hasNextLine()){ 
    str=sc.nextLine(); 
    //... 
} 

đó là độc giả mà trở về null trên EOF

ofcourse in t đoạn mã của anh ta phụ thuộc vào việc đầu vào có được định dạng đúng hay không

2

Vì lý do gì đó, lớp Máy quét cũng phát hành cùng ngoại lệ này nếu gặp phải các ký tự đặc biệt mà nó không đọc được. Ngoài sử dụng phương pháp hasNextLine() trước mỗi cuộc gọi đến nextLine(), đảm bảo mã hóa chính xác được chuyển tới các nhà xây dựng Scanner, ví dụ:

Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");

1

vấn đề thực sự của bạn là bạn đang gọi "sc.nextLine()" hơn lần so với NUMBER dòng.

Bạn cần phải biết, nếu bạn chỉ có 10 dòng nhập, sau đó bạn chỉ có thể gọi là "sc.nextLine()" 10 TIMES.

Mỗi khi bạn gọi "sc.nextLine()", một dòng đầu vào sẽ được sử dụng. Nếu bạn gọi "sc.nextLine()" nhiều hơn số dòng, bạn sẽ có một ngoại lệ được gọi là "java.util.NoSuchElementException: Không tìm thấy dòng".

Nếu bạn phải gọi là "sc.nextLine()" "N" lần, sau đó bạn phải có ít nhất "N" dòng.

Cố gắng thay đổi mã của bạn để phù hợp với số lần bạn gọi là "sc.nextLine()" với số dòng, và tôi ĐẢM BẢO rằng vấn đề của bạn sẽ được giải quyết.