Как исправить исключение NumberFormatException в Java?

Я пытаюсь найти центр тетриса для T-Spin.

Обновлено: Журнал ошибок:

04-08 22:53:13.078 8438-8438/com.example.tetris000 E/MYAPP: exception
                                                            java.lang.NumberFormatException: For input string: "4.0"
at java.lang.Integer.parseInt(Integer.java:608)
at java.lang.Integer.parseInt(Integer.java:643)
at com.example.tetris000.MainActivity.getCenter(MainActivity.java:1457)
at com.example.tetris000.MainActivity.checkLine(MainActivity.java:1500)
at com.example.tetris000.MainActivity.lockPiece(MainActivity.java:1704)
at com.example.tetris000.MainActivity.hardDrop(MainActivity.java:1242)
at com.example.tetris000.MainActivity.onDropClick(MainActivity.java:1209)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:6891)
at android.widget.TextView.performClick(TextView.java:12651)
at android.view.View$PerformClick.run(View.java:26083)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
04-08 22:53:15.909 8438-8438/com.example.tetris000 E/MYAPP: exception
java.lang.NumberFormatException: For input string: "4.0"
at java.lang.Integer.parseInt(Integer.java:608)
at java.lang.Integer.parseInt(Integer.java:643)
at com.example.tetris000.MainActivity.getCenter(MainActivity.java:1457)
at com.example.tetris000.MainActivity.checkLine(MainActivity.java:1500)
at com.example.tetris000.MainActivity.lockPiece(MainActivity.java:1704)
at com.example.tetris000.MainActivity$7.handleMessage(MainActivity.java:1732)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Наконец функция getCenter():

public void getCenter(Boolean rotateRight){;
        double placeholder;
        double rounded = (rotation.point1.x + rotation.point2.x + rotation.point3.x + rotation.point4.x);
        double roundedX = rounded / 4;
        rounded = (rotation.point1.y + rotation.point2.y + rotation.point3.y + rotation.point4.y); // Divison error fixed
        double roundedY = rounded / 4; //Problem is that it will sometimes be roundedY = 12.25 and we need to fix it so it rounds down to 12 or up to 13, but increment is only 0.1

        if (rotation.rotateAmount == 0){
            roundedY *= 100;
            placeholder = roundedY;
            roundedY -= placeholder % 100;
            roundedY /= 100;
            roundedX *= 100;
            if (roundedX % 100 != 0) {
                placeholder = roundedX;
                if (rotateRight) {
                    if (roundedX % 100 >= 50) {
                        roundedX += 100 - (placeholder % 100);
                    } else {
                        roundedX -= placeholder % 100;
                    }
                } else {
                    if (roundedX % 100 > 50) {
                        roundedX += 100 - (placeholder % 100);
                    } else {
                        roundedX -= placeholder % 100;
                    }
                }
            }
            roundedX /= 100;
        } else if (rotation.rotateAmount == 1){
            roundedX *= 100;
            placeholder = roundedX;
            roundedX -= placeholder % 100;
            roundedX /= 100;
            roundedY *= 100;
            if (roundedY % 100 != 0) {
                placeholder = roundedY;
                if (rotateRight) {
                    if (roundedY % 100 <= 50) {
                        roundedY -= placeholder % 100;
                    } else {
                        roundedY += 100 - (placeholder % 100);
                    }
                } else {
                    if (roundedY % 100 < 50) {
                        roundedY -= placeholder % 100;
                    } else {
                        roundedY += 100 - (placeholder % 100);
                    }
                }
            }
            roundedY /= 100;
        } else if (rotation.rotateAmount == 2){
            roundedY *= 100;
            placeholder = roundedY;
            if (100 - (placeholder % 100) == 100 || 100 - (placeholder % 100) == 0){} else {
                roundedY += 100 - (placeholder % 100);
            }
            roundedY /= 100;
            roundedX *= 100;
            if (roundedX % 100 != 0) {
                placeholder = roundedX;
                if (rotateRight) {
                    if (roundedX % 100 <= 50) {
                        roundedX -= placeholder % 100;
                    } else {
                        roundedX += 100 - (placeholder % 100);
                    }
                } else {
                    if (roundedX % 100 < 50) {
                        roundedX -= placeholder % 100;
                    } else {
                        roundedX += 100 - (placeholder % 100);
                    }
                }
            }
            roundedX /= 100;
        } else if (rotation.rotateAmount == 3){
            roundedX *= 100;
            placeholder = roundedX;
            if (100 - (placeholder % 100) == 100 || 100 - (placeholder % 100) == 0){} else {
                roundedX += 100 - (placeholder % 100);
            }
            roundedX /= 100;
            roundedY *= 100;
            if (roundedY % 100 != 0) {
                placeholder = roundedY;
                if (rotateRight) {
                    if (roundedY % 100 >= 50) {
                        roundedY += 100 - (placeholder % 100);
                    } else {
                        roundedY -= placeholder % 100;
                    }
                } else {
                    if (roundedY % 100 > 50) {
                        roundedY += 100 - (placeholder % 100);
                    } else {
                        roundedY -= placeholder % 100;
                    }
                }
            }
            roundedY /= 100;
        }
        centerX = Integer.parseInt(Double.toString(roundedX));
        centerY = Integer.parseInt(Double.toString(roundedY));
    }

попробуй распечатать исключение - там куча информации

Scary Wombat 09.04.2019 04:51

Ладно, думаю, я это сделал :)

Piemanray314 09.04.2019 04:56

Очень странно, что вы поняли, что у вас ошибка в getCenter, но выложили весь код ноgetCenter - все равно исключение говорит вам, почему и где его нет.

Scary Wombat 09.04.2019 04:59

Я не обязательно понимаю большинство отчетов о сбоях, и когда я просмотрел их, это не помогло. Довольно новичок в Java и Android Studio и ни в коем случае не профессионал, все еще студент и учится! Не могли бы вы объяснить ошибку?

Piemanray314 09.04.2019 05:01

Вы не можете разобрать строковое представление double как int, да и не нужно. Вам просто нужно centerX = (int)roundedX;и т.п.. Ничего из парсинга. Вам также необходимо научиться читать трассировку стека.

user207421 09.04.2019 05:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
943
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сообщение об ошибке кажется довольно понятным:

java.lang.NumberFormatException: For input string: "4.0"
       at java.lang.Integer.parseInt()

Ваша строка выглядит как значение с плавающей запятой, а не целое число.

РЕДАКТИРОВАТЬ

Собственно этот разбор

centerX = Integer.parseInt(Double.toString(roundedX));

вообще не нужен, так как вы можете напрямую привести double к int:

centerX = (int)roundedX;

См. тип литья

Зачем вам конвертировать double в String только для того, чтобы снова преобразовать его? Проблема намного проще, чем эта. Все, что нужно, это приведение типа.

user207421 09.04.2019 05:15

Вы звоните Double.parseDouble(). КЭД. Double.parseDouble() требуется String. Откуда это? Ваш ответ подразумевает Double.parseDouble(Double.toString(roundedX)), что является пустой тратой времени и места. (int)roundedX достаточно. В вашем ответе нет приведения типов, независимо от того, сколько раз вы его читали.

user207421 09.04.2019 05:43

Отсюда For input string: "4.0"

Marcin Orlowski 09.04.2019 05:46

Нет. Это произошло из кода ОП, а именно из Double.toString(roundedX). Вы цитируете сообщение об ошибке, появившееся в результате попытки проанализировать полученную в результате строку. Вы ставите телегу впереди лошади.

user207421 09.04.2019 05:52

Не читал его код, просто трассировку стека. И правда, парсинг в таком случае не нужен. По какой-то причине я предположил, что он получил это значение от пользователя, так как это обычная проблема.

Marcin Orlowski 09.04.2019 05:57

Так что на данный момент это даже не ответ. Вы не определили основную проблему и не предложили решения.

user207421 09.04.2019 06:12

Другие вопросы по теме