java.lang.NumberFormatException: For input string: "10"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:441)
相关的代码段:
public static class NodeWritable implements Writable {
public double msg;
public double rank;
public String others;
public NodeWritable(double msg, double rank, String others) {
this.msg = msg;
this.rank = rank;
this.others = others;
}
public NodeWritable() {
this.msg = 0.0;
this.rank = 0.0;
this.others = "";
}
@Override
public void write(DataOutput out) throws IOException {
out.writeDouble(msg);
out.writeDouble(rank);
out.writeChars(others + "\n");
}
@Override
public void readFields(DataInput in) throws IOException {
msg = in.readDouble();
rank = in.readDouble();
others = in.readLine();
}
@Override
public String toString() {
return "" + rank;
}
}
ArrayList<Long> incoming_vids = new ArrayList<Long>();
for (NodeWritable msg : messages) {
String in_vid = msg.others.trim();
incoming_vids.add(Long.parseLong(in_vid));
}
这怎么可能发生?我和谷歌做过一些研究。有时NumberFormatException
似乎是由大数字造成的。但我找不到可能的解释。
答案 0 :(得分:0)
这实际上是一个扩展的评论,而不是答案。我的假设是问题是输入字符串中的非打印字符。可以通过将代码更改为:
进行测试 for (NodeWritable msg : messages) {
String in_vid = msg.others.trim();
try{
incoming_vids.add(Long.parseLong(in_vid));
} catch(NumberFormatException e){
System.out.println(e.getMessage());
for(char c : in_vid.toCharArray()){
System.out.println("0x"+Integer.toHexString(c));
}
}
}
此代码应导致输入字符串的逐字符十六进制打印输出。
如果是嵌入式非打印字符,您可能应该拒绝该字符串,并将其固定在其原点。
答案 1 :(得分:0)
您可以使用此
循环字符串in_vid并检查是否有任何字符不是数字 for(int i=0;i<in_vid.length();i++) {
char ch = in_vid.charAt(i);
if( Character.isDigit(ch)) {
// do something
}
}
如果它不是数字,则可以在循环中消除它并仅传递具有数字的字符串。