有人可以帮我弄清楚如何解决一个奇怪的(对我来说)问题。 我们的想法是从文件中获取一个简短的字符串(准确的字符串是" 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;已经很久了,如果有人能给我一个小费,我将不胜感激。
答案 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 )中包含一个隐藏字符出现了这个问题。
要解决您的问题,您可以使用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或空的值吗?