解析负整数时出现 NumberFormatException
NumberFormatException when parsing negative integer
我正在编写一个 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)
下面的解决方案是我从另一个Whosebug线程上拿来的,这似乎是导师要我们使用的,但是在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?
编辑:第三个问题。如果我从不解析回 int,为什么我的解决方案 return 为 false?
if(Integer.parseInt(origNumber) == Integer.parseInt(reverse)) // works
到
if(origNumber == reverse) // does not work
谢谢!
好的,解决第一个和第二个问题的最简单方法就是使用 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").
希望对您有所帮助!! ;)
我正在编写一个 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)
下面的解决方案是我从另一个Whosebug线程上拿来的,这似乎是导师要我们使用的,但是在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?
编辑:第三个问题。如果我从不解析回 int,为什么我的解决方案 return 为 false?
if(Integer.parseInt(origNumber) == Integer.parseInt(reverse)) // works
到
if(origNumber == reverse) // does not work
谢谢!
好的,解决第一个和第二个问题的最简单方法就是使用 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").
希望对您有所帮助!! ;)