Java не может привести от строки к Integer_Sovled - PullRequest
0 голосов
/ 22 ноября 2011
HashMap<String, String> config = Feeds.config; 

String num =  config.get("NumOfFeeds");

System.out.println(num);

feedsAmount = ((Integer)num).intValue();

System.out.println(feedsAmount);

Я также пробовал Integer.parseInt(num) и Integer.decode(num) и Integer.valueof(bu)

Результаты выглядят следующим образом: 40

Exception in thread "main" java.lang.NumberFormatException: For input string:"40"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:458)
at java.lang.Integer.parseInt(Integer.java:499)
at fetch_RSS.<init>(fetch_RSS.java:40)
at testing.main(testing.java:27)

Проблема была вызвана другой кодировкой изtxt-файл, из которого я читаю, и кодировка в Elipse, которая по умолчанию является macRoman.

Ответы [ 5 ]

1 голос
/ 22 ноября 2011

Ваше исключение поднято в Integer.java:458.

Просмотр исходного кода Integer Я вижу, что некоторые символы вашей строки "40" возвращали отрицательное значение (наиболее вероятно -1) для Character.digit(s.charAt(i++), radix), где i выполняет итерацию по символам строки иradix 10.

Это не должно происходить нормально.Но это происходит, когда String равен «4o», а не «40», как дикая догадка @ Løkling в комментариях.

Вы должны отладить здесь, чтобы увидеть, что на самом деле происходит.

1 голос
/ 22 ноября 2011

Правильный способ работы таков:

String num = config.get("NumOfFeeds");
int feeds = Integer.parseInt(num);

Это, только если вы уверены, что String представляет число действительным образом.

-30         // correct
0           // correct
2000        // correct


"40"        // invalid
40          // valid

2.000       // invalid
2.000.000   // invalid
20,0        // invalid
2,000,000   // invalid
0 голосов
/ 22 ноября 2011

Помните: в java мы можем приводить объекты только в том случае, если они ЯВНО одного и того же типа!В других языках, таких как python, мы можем выполнить запрос, который вы запрашивали здесь, потому что эти языки допускают "типизацию утки".

Вы должны использовать Integer.parseInt ("1234"), чтобы создать объект Integer изString.

В качестве альтернативы вы можете создать обертку Object для ваших данных:

class MyObject
{
    Object input; 
   public MyObject(Object input)
    {
         this.input=input;
    }

    public Integer getInt()
   {  
    return Integer.parseInt(input.toString());
   }
    public String getString()
   {
       return input.toString();
   }
} 

Однако это было бы излишним для вашей простой задачи:)

0 голосов
/ 22 ноября 2011

Для успешного приведения в Java преобразуемая ссылка должна указывать на объект, который на самом деле является экземпляром преобразуемого типа. Ссылка на String не может быть приведена к Integer, потому что объект не может быть обеими вещами.

(Это несколько не похоже на приведение в C, которое, по сути, просто говорит, переосмыслить данные, хранящиеся здесь, в соответствии с другим типом данных. Было бы неправильно использовать C в качестве метода преобразования строки, представляющей число к числовому значению.)

Integer.parseInt - это то, что вы ищете здесь. Что у вас за проблема?

0 голосов
/ 22 ноября 2011

Конечно, вы не можете разыграть от String до Integer. A String не является Integer, а Integer не является String.

Вы должны использовать int i = Integer.parseInt(..). Это работает, если строка является правильно отформатированным целым числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...