2014-01-02 2 views
-1

Я получил строку "16" через http. Но когда я пытаюсь разобрать его на целое число:Невозможно разобрать «16» как целое

Integer.parseInt(result); 

я получаю это:

java.lang.NumberFormatException: For input string: "16" 

это может быть что-то делать с моим кодированием? Разумеется, тогда он не появится как "16", а что-то нечитаемое?

EDIT ok Я пропустил код изначально, потому что его слишком много. Вот префикс:

URL url = new URL(myurl); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestMethod("GET"); 
conn.setDoInput(true); 
conn.connect(); 
is = conn.getInputStream(); 
String contentAsString = readIt(is); 
return contentAsString; 

readIt() method.

public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException { 
    Reader reader = null; 
    reader = new InputStreamReader(stream, "UTF-8");   
    char[] buffer = new char[len]; 
    reader.read(buffer); 
    return new String(buffer); 
} 
+9

Не могли бы вы показать код, создающий эту ошибку? –

+4

Используете ли вы кавычки для разграничения строкового литерала или кавычки в самой строке? Покажите нам ** точный строковый литерал **, который вы передаете 'parseInt()'. –

+0

Вы пытаетесь выполнить 'int myInt = Integer.ParseInt (" theString ")' ???? – jjmartinez

ответ

1

Как разные люди отмечали, оказывается, были нагрузкой непечатных символов после 16

облицовку() или заменить() варианты как работали, но проблема заключается в методе я скопировал из страница обучения разработчиков Android!

Когда я заменил его с чем-то основано на

 BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 

Проблема ушла.

Чтобы быть справедливым, я не очень заинтересован в том, чтобы тратить часы на повторное изобретательство колеса, делающего манипуляции с входным потоком, так как у меня есть приложение для записи. Я просто хотел превратить поток в String и использовал первую часть кода, которая работала или казалась.

4

Попробуйте это:

Integer.parseInt(result.trim()); 

Возможно у вас есть символ пробела в конце. Посмотрите на these characters.

'\u001C','\u001D','\u001E','\u001F' дают точно такую ​​же ошибку.

String str = "16\u001C"; 
System.out.println(Integer.parseInt(str.trim())); 
System.out.println(Integer.parseInt(str)); 
+0

По крайней мере, в Java 7 сообщение об ошибке не было бы «16», если бы существовало конечное пробел или разделитель строк; просто протестировал его. –

+0

@Brian Roach См. Обновление выше. – Alex

+0

Это работает, но, на мой взгляд, он лечит симптомы. – mdarwin

4

Попробуйте это

Integer.parseInt(result.replaceAll("[^0-9]", "")); 
+0

это работает, но я не уверен, что он должен использоваться OP, зависит от требования. в случае, если недопустимая строка (путем ввода пользователем i.e) выкинет исключение во время выполнения или сделает что-то еще, это сделает почти все строки действительными. – Kent

+0

Речь идет о остальной части вашего кода. В этом вопросе проблема заключалась в том, что вы передавали символы, отличные от цифр, в 'parseInt'. Так вы его решаете. У меня нет полного кода, поэтому я ничего не могу сказать о других операциях. –

+0

Это работает, но, на мой взгляд, лечит симптомы – mdarwin

2

Я извлек строку "16" над HTTP

Нет у вас нет. Вы получили строку, содержащую «16» и некоторые другие нежелательные символы, например nul. Сбросьте весь байтовый байт по байтам, и вы увидите. Вам нужно исправить это у источника.

+0

справа, петля над result.getBytes() обнаруживает нагрузку бесполезных (и непечатаемых) символов. – mdarwin

+0

@mdarwin хорошо, это твоя проблема. –

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