2012-01-26 2 views
1

Здесь я читаю текстовый файл, который содержит целое число в каждой строке, и я печатаю все целые числа, которые появились более одного раза.Формат номера Исключение при чтении из текстового файла

Как вы можете видеть, я использовал Hash Map, и я назначил целые числа как Ключ и число вхождения числа в качестве значения.

Здесь я получаю исключение формата номера здесь. Кто-нибудь может мне с этим помочь?

package fileread; 

import java.io.*; 
import java.util.HashMap; 


public class Main { 


public static void main(String[] args) { 
    // TODO code application logic here 
    HashMap<Integer, Integer> lines = new HashMap<Integer, Integer>(); 
    try { 
     FileInputStream fstream = new FileInputStream("C:/Users/kiran/Desktop/text.txt"); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String str; 

     while ((str = br.readLine()) != null) { 

      Integer intObj = Integer.valueOf(str); 
      if (lines.containsKey(intObj)) { 
       int x = 0; 
       x = lines.get(intObj); 
       if (x == 2) { 
        System.out.println(intObj); 
       } 
       lines.put(intObj, x++); 

      } else { 

       lines.put(intObj, 1); 
      } 
     } 
     in.close(); 
    } catch (Exception e) { 
     System.err.println(e); 
    } 
} 
} 
+0

Сообщение об исключении покажет, что он пытается проанализировать как целое. – hmjd

+1

Необходим ли 'DataInputStream'? Может ли это быть причиной? –

+1

@ nicholas.hauschild Да, что DataInputStream кажется ненужным. Вы должны иметь возможность передавать 'fstream' непосредственно в конструктор' BufferedReader'. –

ответ

3

Это очень вероятно, что ваш номер исключение формат происходит на этой линии:

  Integer intObj = Integer.valueOf(str); 

Смотрите документацию для Integer.valueOf здесь

Я думаю, это потому, что одна из линий не целое число

+1

Это ТОЛЬКО место, где может быть выброшено исключение. Это может быть что-то простое, как лишняя пустая строка в конце файла. Помещение контрольной точки (или даже println) на эту строку для проверки значения «str» выведет нарушителя. –

+0

@ Rodney Gitzel: Ты прав. –

3

Для отладки, я думаю, я бы рекомендовал добавить что-то вроде этой строки прямо в начале цикла:

System.out.println("str = \"" + str + "\"");

Единственное место, где я вижу в этом коде, где вы будете получать NumberFormatException от Integer.valueOf. Я предполагаю, что вы получаете некоторые пробелы или что-то еще в str, и когда вы пытаетесь отформатировать это число, оно не работает.

С другой стороны, если вы хотите, чтобы попытаться поймать, когда это происходит, вы можете попробовать добавить TRY/поймать вокруг Integer.valueof так:

Integer intObj = null; 
try 
{ 
    intObj = Integer.valueOf(str); 
} 
catch(NumberFormatException nfe) 
{ 
    System.err.println("The value \"" + str + "\" is not a number!"); 
} 

Удачи!

2

Попробуйте использовать метод trim() перед предоставлением str в качестве аргумента методу valueOf().

str = str.trim(); 
Integer intObj = Integer.valueOf(str); 

И Кроме того, так как вы используете Input/Output File, почему бы не использовать java.nio пакет вместо того, чтобы использовать старый java.io пакет. То, что java.nio лучше подходит для такого рода работ. Прочтите это для comparison b/w java.nio and java.io

Надеюсь, что это может помочь в некотором роде.

С уважением

+0

+1 для упоминания обрезки. Непечатаемые символы в файлах отключили больше сканирования файлов, чем я когда-либо хотел признать. – Perception

+0

@Принятие: у меня тоже есть те же проблемы :-) Спасибо и привет –

Смежные вопросы