Java,Integer.parseInt()不解析" 117"串

时间:2018-03-24 16:02:37

标签: java string

有人可以帮我弄清楚如何解决一个奇怪的(对我来说)问题。 我们的想法是从文件中获取一个简短的字符串(准确的字符串是" 117_63 _",其中" _"是空格符号,文件本身是UTF-8编码的)我们拆分了这个串成整数" 117"和" 63"但是当我们使用Inetger.parseint()方法转换它们时,它返回异常...

java.lang.NumberFormatException: For input string: "117"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at xor_cipher.get_crypted_ints_from_string(xor_cipher.java:79)
    at xor_cipher.decrypt(xor_cipher.java:49)
    at the_main.main(the_main.java:25)

主要:

///////////////////////////////////
//                               //
//         Main entrance         //
//                               //
///////////////////////////////////
public static void main( String[ ] cmd_arguments ) {
    // Just for the testing
    File fl = new File( "account_database" );
    try 
    {
        Scanner Get = new Scanner( fl );
        String tmp = Get.nextLine( );
        tmp = xor_cipher.decrypt( tmp );
        Get.close( );
    }
    catch ( Exception EXC ) { 
        EXC.printStackTrace( ); 
        System.exit( 1 );
    }
}

调用异常的函数,位于另一个类中:

////////////////////////////////////
//                                //
//   Convert string of integers   //
//   to array of integers ...     //
//                                //
////////////////////////////////////
public static int[ ] get_crypted_ints_from_string( String crypted_ints_as_string ) {
    int amount = 0;

    for ( int i = 0; i < crypted_ints_as_string.length( ); i++ ) {
        if ( crypted_ints_as_string.charAt( i ) == ' ' ) amount++;
        else continue;
    }

    int array[ ] = new int[ amount ];
    int analyzed_border = 0;

    for ( int i = 0; i < array.length; i++ ) {
        String tmp = new String( );
        for ( int j = analyzed_border; j < crypted_ints_as_string.length( ); j++ ) {
            if ( crypted_ints_as_string.charAt( j ) == ' ' ) {
                array[ i ] = Integer.parseInt( tmp ); // <-- exception when tmp="112"
                analyzed_border = j + 1;
                break;
            }
            else if ( j == crypted_ints_as_string.length( ) - 1 ) {
                tmp += crypted_ints_as_string.charAt( j );
                array[ i ] = Integer.parseInt( tmp );
                analyzed_border = j + 1;
                break;
            }
            else tmp += crypted_ints_as_string.charAt( j );
        }
    }
    return array;
}

我曾经&#34;战斗&#34;已经很久了,如果有人能给我一个小费,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

您的输入中有一个隐藏的特殊字符:

让我们检查您输入的确切内容,"117"返回check this

\u0022\ufeff\u0031\u0031\u0037\u0022
      ^^^^^^

但正常输入"117"返回(check this

\u0022\u0031\u0031\u0037\u0022

注意您的输入在开头\ufeff ZERO WIDTH NO-BREAK SPACE )中包含一个隐藏字符出现了这个问题。

Unicode

解决您的问题

要解决您的问题,您可以使用replaceAll替换输入中的所有非数字:

Integer.parseInt("117".replaceAll("\\D", ""))

答案 1 :(得分:1)

你的问题是,你使用Integer.parseInt()可能是一个空字符串。

for ( int i = 0; i < array.length; i++ ) {

    String tmp = new String( ); // << here you instantiate an empty String

    for ( int j = analyzed_border; j < crypted_ints_as_string.length( ); j++ ) {
        if ( crypted_ints_as_string.charAt( j ) == ' ' ) {

            // << up to here tmp never gets changed again. >>
            // << How do you prevent applying Integer.parseInt() on an empty String here? >>

            array[ i ] = Integer.parseInt( tmp ); // <-- exception when tmp="112"
            analyzed_border = j + 1;
            break;
        }

当你输入上面的条件时,你确定tmp肯定总是有一个null或空的值吗?