2013-11-22 51 views
0
java.lang.NumberFormatException: For input string: "10" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Long.parseLong(Long.java:441) 

相關的代碼段:ParseLong提高NumberFormatException的

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)); 
    } 

怎麼能這樣呢?我已經對Google進行了一些調查。有時NumberFormatException似乎是由大數字造成的。但我無法爲我的案子找到可能的解釋。

+5

'Long.parseLong(「10」);'適合我。請提供實際的代碼,而不僅僅是例外。 – noone

+0

你可以給你已經使用的示例代碼 – muthukumar

+1

一種可能性是輸入字符串中的非打印字符。 NumberFormatException是關於** any **的方式,其中輸入字符串不是被解析類型中數字的正確格式化表示,而不僅僅是大輸入。 –

回答

0

您可以循環在字符串in_vid並檢查是否有字符使用比數字之外,本

for(int i=0;i<in_vid.length();i++) { 
      char ch = in_vid.charAt(i); 
     if(Character.isDigit(ch)) { 
// do something 
} 
    } 

如果其他的不是數字,那麼你可以在迴路中消除它,並通過只具有數字串。

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)); 
     } 
    } 
    } 

此代碼應導致輸入字符串逐個字符的十六進制打印輸出。

如果它是一個嵌入的非打印字符,您應該拒絕該字符串,並將其固定在其原始位置。