2016-04-30 11 views
5

Tôi đang gặp một số sự cố khi cố gắng đọc một Chuỗi và một Đôi từ tệp txt. Dưới đây là file txt của tôi:Cần phải đọc Chuỗi và Đôi từ tệp

Mike 300.50 
John 260 
Lisa 425.33 

Và đây là đoạn code tôi đang sử dụng để đọc chúng:

reader = new Scanner(); 
while(reader.hasNext()){ 
    name= reader.next(); 
    salary = reader.nextDouble(); 
    System.out.println(name + " " + salary + "\r\n"); 
} 

Bất cứ khi nào tôi chạy mã này, Exception in thread "main" java.util.InputMismatchException xuất hiện nói với tôi vấn đề là ở nextDouble().

Có ai biết cách giải quyết vấn đề này không?

+0

'nextDouble()' rời khỏi dòng mới để cuộc gọi thứ hai của bạn tới 'next()' tiêu thụ dòng mới và sau đó bạn thử phân tích cú pháp tên tiếp theo thành một double. Tôi đề nghị bạn đọc toàn bộ dòng tại một thời điểm. –

+0

Bằng cách làm như vậy tôi sẽ không thể lưu cả hai thứ trong các thuộc tính khác nhau. Hay tôi có thể? – Tom

Trả lời

0

Bạn có thể thử cách này:

while(reader.hasNextLine()){ 
    String[] values = reader.nextLine().split("\\s+"); 
    name= values[0]; 
    salary = Double.valueOf(values[1]); 
    System.out.println(name + " " + salary + "\r\n"); 
} 
+0

Xin lỗi vì bận tâm, nhưng những dòng đó làm gì? Cảm ơn. – Tom

+0

Tôi muốn biết những dòng này: name = values ​​[0]; lương = Double.valueOf (giá trị [1]); – Tom

+0

'' reader.nextLine(). Split ("\\ s +"); '' chia dòng đơn tại một thời điểm theo không gian và lưu nó trong một mảng String. Vì vậy, tôi nhận được tên chuỗi bởi '' giá trị [0] '' phần tử đầu tiên của mảng và '' Double.valueOf (giá trị [1]) '' phân tích cú pháp phần tử thứ hai để tăng gấp đôi – mmuzahid

-1

bạn có thể sử dụng java.io.StreamTokenizer để đọc String và kép. StreamTokenizer chia tệp thành thẻ với kiểu dữ liệu thích hợp. và bằng cách sử dụng một số hằng số, bạn có thể xác định loại mã thông báo. như TT_NUMBER, TT_WORD

File f=new File("path of file"); 
StreamTokenizer st=new StreamTokenizer(new FileInputStream(file)); 
while(st.nextToken()!=StreamTokenizer.TT_EOF) //getting contents of file{ 
    switch(st.ttype) 
    { 
     case StreamTokenizer.TT_EOF: break; 
     case StreamTokenizer.TT_NUMBER://it will read number always in double data type 
      no=st.nval; 
     break; 
     case StreamTokenizer.TT_WORD: 
      name=st.nval; 
     break; 
    }} 
+0

Tại sao điều này lại được bình chọn? – Basilevs

3
reader = new Scanner(); 
while(reader.hasNext()){ 
    name= reader.next();  
    salary = reader.nextDouble(); 
    System.out.println(name + " " + salary + "\r\n"); 
    reader.nextLine(); 
} 

Hãy thử điều này. Điều gì đang xảy ra là máy quét đang đọc dòng trống sau mỗi lần tăng gấp đôi, vì vậy tên sẽ là dòng trống, và nó sẽ đọc (ví dụ) John làm tiền lương, và cho bạn ngoại lệ đó. Vì vậy, những gì tôi đã làm là thêm dòng mã nhỏ: reader.nextLine(); để nó có thể bỏ qua dòng trống đó. Hi vọng điêu nay co ich.

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