NumberFormatException при разборе отрицательного целого числа - PullRequest
0 голосов
/ 24 января 2019

Я пишу Java-программу, чтобы определить, является ли число палиндромом.

Мой код работает правильно, если переданный аргумент является положительным целым числом, но выдает исключение NumberFormatException при передаче отрицательного целого числа.

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:662)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at com.stu.Main.isPalindrome(Main.java:28)
at com.stu.Main.main(Main.java:7)

Следующее решение, которое я взял из другого потока stackoverflow, кажется, что инструктор хочет, чтобы мы его использовали, однако в цикле while я предполагаю, что, поскольку отрицательное число всегда меньше 0, оно выйдет из цикла. а не рассчитать палиндром:

public static int reverse(int number)
        {  
            int result = 0;
            int remainder;
            while (number > 0)
            {
                remainder = number % 10;
                number = number / 10;
                result = result * 10 + remainder;
            }

            return result;
        }

Итак, я использую строки в своем решении ниже, чтобы решить эту проблему.

Примечание: мы еще не дошли до разбиений и регулярных выражений.

public class Main {

    public static void main(String[] args) {

        isPalindrome(-1221); // throws exception
        isPalindrome(707);   // works as expected - returns true
        isPalindrome(11212); // works as expected - returns false
        isPalindrome(123321);// works as expected - returns true
    }


    public static boolean isPalindrome(int number){

        if(number < 10 && number > -10) {
            return false;
        }

        String origNumber = String.valueOf(number);
        String reverse = "";

        while(number > 0) {
            reverse += String.valueOf(number % 10);
            number /= 10;
        }

        if(Integer.parseInt(origNumber) == Integer.parseInt(reverse)) {
            System.out.println("The original number was " + origNumber + "     and the reverse is " + reverse);
            System.out.println("Number is a palindrome!");
            return true;
        }
        else
            System.out.println("The original number was " + origNumber + " and the reverse is " + reverse);
            System.out.println("Sorry, the number is NOT a palindrome!");
            return false;
    }
}

Я ищу две вещи здесь.

Во-первых, как мне решить проблему с отрицательным числом в цикле while в случае предпочтительного решения инструкторами?

Во-вторых, как я могу решить NumberFormatException в моем решении?

Редактировать: третий вопрос. Почему мое решение возвращает false, если я никогда не анализирую обратно в int?

if(Integer.parseInt(origNumber) == Integer.parseInt(reverse)) // works
* * 1022 до * * 1023
if(origNumber == reverse) // does not work

Спасибо!

1 Ответ

0 голосов
/ 24 января 2019

Хорошо, самый простой способ решить вашу первую и вторую проблему - просто удалить отрицательный знак с помощью Math.abs(yourNumber) и все. Как,

The java.lang.Math.abs() returns the absolute value of a given argument.

If the argument is not negative, the argument is returned.
If the argument is negative, the negation of the argument is returned.

Это решит как вашу первую, так и вторую проблему.

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

== tests for reference equality (whether they are the same object).
.equals() tests for value equality (whether they are logically "equal").

Надеюсь, это поможет! ;)

...