2016-09-26 9 views
25

तो, मेरे पास एक समस्या है जो वास्तव में मुझे परेशान करती है। मेरे पास एक साधारण पार्सर है जिसे मैंने जावा में बनाया था। यहां प्रासंगिक कोड का टुकड़ा दिया गया है:java.lang.NumberFormatException "1"

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

इनपुट फ़ाइल सीएसवी फ़ाइल है, फ़ाइल की पहली प्रविष्टि एक पूर्णांक है। जब मैं पार्स करने शुरू, मैं तुरंत इस अपवाद प्राप्त करें:

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) 

मैं फ़ाइल की जाँच की, यह वास्तव में है 1 इसके पहले मूल्य के रूप में (कोई अन्य पात्रों के उस क्षेत्र में कर रहे हैं), लेकिन मैं अभी भी संदेश मिलता है। मुझे लगता है कि यह फ़ाइल एन्कोडिंग की वजह से हो सकता है: यह यूनिक्स एंडलाइन के साथ यूटीएफ -8 है। और कार्यक्रम उबंटू 14.04 पर चलाया जाता है। किसी भी सुझाव जहां समस्या की तलाश है, स्वागत है।

+9

प्रश्न में त्रुटि डालने के लिए कॉपी और पेस्ट का उपयोग करके अच्छा लगा! –

उत्तर

35

आपके पास उस नंबर के सामने BOM है; अगर मैं आपके प्रश्न में "1" जैसा दिखता हूं और इसे vim में पेस्ट करता हूं, तो मुझे लगता है कि आपके सामने एक एफई एफएफ (उदा।, BOM) है। उस लिंक से:

बीओएम समेत सटीक बाइट्स जो भी यूनिकोड चरित्र यू + एफईएफएफ को उस रूपांतरण प्रारूप द्वारा परिवर्तित किया जाएगा।

ताकि मुद्दा है, परिवर्तन (UTF-8, UTF-16 बड़े endian, UTF-16 छोटे-endian, आदि) फ़ाइल के साथ इनकोडिंग के लिए उपयुक्त रीडर के साथ फ़ाइल खपत करते हैं। जावा में यूनिकोड फ़ाइलों को पढ़ने के बारे में अधिक जानने के लिए this question and its answers भी देखें।

+1

@Doval: ** धन्यवाद, ** मैं यह कहना गलत था कि यह एक यूटीएफ -8 बीओएम था, और आप सही हैं कि ऑन-द-वायर, यूटीएफ -8 के लिए बीओएम ईएफ बीबी बीएफ है। लेकिन हम जो देख रहे हैं वह फ़ाइल पढ़ने और * त्रुटि संदेश में आउटपुट देखने के * अंतिम परिणाम * है। फ़ाइल किसी भी परिवर्तन में हो सकती है; सभी बीओएम एफई एफएफ होने के बाद खत्म हो जाते हैं * एक बार पढ़ा जाता है *। –

+0

लेकिन अगर इसे * कच्चा * पढ़ा गया था, तो ... ओह, मुझे नहीं पता। :-) यूटीएफ -16 अच्छी तरह से हो सकता है। :-) यह सब इस बात पर निर्भर करेगा कि फ़ाइल को स्ट्रीम में कैसे पढ़ा गया था। –

+1

"सभी बीओएम एक बार पढ़े जाने पर एफई एफएफ होने का अंत हो जाते हैं" - बिल्कुल नहीं। सभी बीओएम यू + एफईएफएफ (जो 0xFE 0xFF के समान नहीं है क्योंकि यह बाइट्स के अनुक्रम की बजाय कोड बिंदु है) एक बार * डीकोड * हो जाता है। डिकोडिंग से पहले, आपके पास बाइट्स है, जो कि किसी भी एन्कोडिंग में हो सकता है जो यूनिकोड वर्णों का प्रतिनिधित्व कर सकता है (ज्यादातर यूटीएफ -8 और यूटीएफ -16 लेकिन अन्य मौजूद हैं)। – Kevin

संबंधित मुद्दे