2016-09-26 14 views
25

Vì vậy, tôi gặp vấn đề thực sự làm phiền tôi. Tôi có một trình phân tích cú pháp đơn giản mà tôi đã tạo trong java. Đây là đoạn mã có liên quan:java.lang.NumberFormatException cho chuỗi đầu vào "1"

while((line = br.readLine())!=null) 
{ 
    String splitted[] = line.split(SPLITTER); 
    int docNum = Integer.parseInt(splitted[0].trim()); 
    //do something 
} 

Tệp đầu vào là tệp CSV, mục nhập đầu tiên của tệp là số nguyên. Khi tôi bắt đầu phân tích, tôi immidiately được ngoại lệ này:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at java.lang.Integer.parseInt(Integer.java:615) 
at dipl.parser.TableParser.parse(TableParser.java:50) 
at dipl.parser.DocumentParser.main(DocumentParser.java:87) 

Tôi đã kiểm tra các tập tin, nó thực sự có 1 là giá trị đầu tiên của mình (không có nhân vật khác là trong lĩnh vực đó), nhưng tôi vẫn nhận được thông báo. Tôi nghĩ rằng nó có thể là do mã hóa tập tin: nó là UTF-8, với Unix endlines. Và chương trình được chạy trên Ubuntu 14.04. Bất kỳ đề xuất nơi tìm kiếm vấn đề được chào đón.

+9

Đẹp bằng cách sử dụng sao chép và dán để đặt lỗi trong câu hỏi! –

Trả lời

35

Bạn có số BOM trước số đó; nếu tôi sao chép những gì trông giống như "1" trong câu hỏi của bạn và dán nó vào vim, tôi thấy rằng bạn có FE FF (ví dụ: BOM) ở phía trước. Từ liên kết đó:

Các byte chính xác bao gồm BOM sẽ là bất kỳ ký tự Unicode U + FEFF nào được chuyển đổi thành định dạng chuyển đổi đó.

Vì vậy, đó là vấn đề, tiêu thụ tệp với trình đọc thích hợp để chuyển đổi (UTF-8, UTF-16 lớn cuối, UTF-16 nhỏ cuối, v.v.) tệp được mã hóa. Xem thêm this question and its answers để biết thêm về cách đọc các tệp Unicode trong Java.

+1

@Doval: ** Cảm ơn bạn, ** Tôi hoàn toàn sai khi nói rằng đó là một UTF-8 BOM, và bạn hoàn toàn đúng rằng on-the-wire, BOM cho UTF-8 là EF BB BF. Nhưng những gì chúng ta đang xem là kết quả * cuối cùng của việc đọc tệp và sau đó nhìn thấy đầu ra trong thông báo lỗi. Các tập tin có thể được trong bất kỳ chuyển đổi; tất cả các BOM cuối cùng là FE FF * một lần đọc *. –

+0

Nhưng nếu nó được đọc * raw *, thì ... oh, tôi không biết. :-) Cũng có thể là UTF-16. :-) Tất cả sẽ phụ thuộc vào cách tệp được đọc vào luồng. –

+1

"tất cả các BOM cuối cùng là FE FF một lần đọc" - Không hoàn toàn. Tất cả các BOM cuối cùng là U + FEFF (không giống với 0xFE 0xFF vì nó là một điểm mã thay vì một chuỗi các byte) một lần * được giải mã *. Trước khi giải mã, tất cả những gì bạn có là byte, có thể là bất kỳ mã hóa nào có thể đại diện cho các ký tự Unicode (chủ yếu là UTF-8 và UTF-16 nhưng những thứ khác tồn tại). – Kevin

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