如何解决从 Integer.parseInt() 获取“NumberFormatException”,可能来自误解
我只是想知道为什么我的代码给我一个 NumberFormatException?
从堆栈溢出的其他帖子来看,人们似乎对空格有问题,但我的似乎根本没有这个问题。
package suop.space;
import java.util.BitSet;
public class ColourUtils {
public static short getAlpha(final int rgb) {
return (short) ((rgb >> 24) & 0xff);
}
public static short getRed(final int rgb) {
return (short) ((rgb & 0x00ff0000) >> 16);
}
public static short getGreen(final int rgb) {
return (short) ((rgb & 0x0000ff00) >> 8);
}
public static short getBlue(final int rgb) {
return (short) (rgb & 0x000000ff);
}
public static int getRGB(int alpha,int red,int green,int blue) {
BitSet rgbValueBitSet = new BitSet(32);
addIntToBitSet(alpha,rgbValueBitSet,0);
addIntToBitSet(red,9);
addIntToBitSet(green,17);
addIntToBitSet(blue,25);
System.out.println("rgbValueBitSet: " + rgbValueBitSet);
StringBuilder rgbBinaryStringBuilder = new StringBuilder();
for (int i = 0; i < rgbValueBitSet.length(); i++) {
if (rgbValueBitSet.get(i)) {
rgbBinaryStringBuilder.append(1);
} else {
rgbBinaryStringBuilder.append(0);
}
}
System.out.println(rgbBinaryStringBuilder.toString());
int rgbValue = Integer.parseInt(rgbBinaryStringBuilder.toString(),2);
System.out.println(rgbValue);
return rgbValue;
}
private static void addIntToBitSet(int inputInt,BitSet inputBitSet,int byteToStartFrom) {
char[] inputCharArray = Integer.toBinaryString(inputInt).toCharArray();
int[] inputIntArray = new int[inputCharArray.length];
for (int i = 0; i < inputCharArray.length; i++) {
inputIntArray[i] = Character.getNumericValue(inputCharArray[i]);
}
for (int i = 0; i < inputIntArray.length; i++) {
if (inputIntArray[i] >= 1) {
inputBitSet.set(i + byteToStartFrom);
} else {
inputBitSet.clear(i + byteToStartFrom);
}
}
}
}
尝试运行程序时出现此错误:
rgbValueBitSet: {0,1,2,3,4,5,6,7,9,10,12,13,14,15,17,18,20,21,22,23,25,26,28,29,30,31}
11111111011011110110111101101111
Exception in thread "main" java.lang.NumberFormatException: For input string: "11111111011011110110111101101111" under radix 2
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:660)
at suop.space.ColourUtils.getRGB(ColourUtils.java:45)
at suop.space.EffectsUtils.divideByTwo(EffectsUtils.java:19)
at suop.space.Main.main(Main.java:38)
Process finished with exit code 1
那个 11111111011011110110111101101111
是我试图通过 Integer.parseInt()
解析的内容。
我猜它可能试图使 11111111011011110110111101101111 本身成为一个整数,这比整数大得多。问题是告诉它我认为的基数会使其将其识别为二进制,尽管我不确定。
解决方法
您有一个表示 32 位无符号值的字符串。 'int' 是一个 32 位有符号值,即字符串值中没有符号,输入不能超过 31 位。
负数的内部表示设置了高位并不意味着您可以在该数字的字符串表示中显式设置高位。
你和你尝试的情况一样
parseInt("4285493103",10);
在 Java 8 之后,有 parseUnsignedInt,在我看来它可以满足您的需求。我不能亲自担保,因为从来不需要使用它。
否则,请使用 parseLong。
by telling it the radix I thought would make it identify it as binary,
它被解析为二进制:这意味着它只是以 2 为基数。基数不会改变负值的表示形式,也不会改变允许的绝对范围。
也许这个小测试程序可以帮助您了解发生了什么?
class N {
static public void main(String... a) {
System.out.println(Integer.parseUnsignedInt("11111111011011110110111101101111",2));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。