2016-10-05 14 views
-1

文字列が以下のコードを使用して連続した整数で構成されているかどうかを判断しようとしています。しかし、実行するとNumberFormatExceptionがスローされます。substring()を使用した場合のNumberFormatException

これは、substring()のインデックス値として変数iを使用したことが原因であると判断しました。

私はそれを行う別の方法を見つけることができないので、これは本当に不満でした。誰もがなぜsubstring()がインデックス値として変数を使用できないのか、この問題を解決/回避するために何ができるのかを知っていますか? (巨大なifステートメントを使用する以外の)任意のヘルプは本当に感謝される!ありがとう!

public static void main(String[] args) { 

    String x = "12345"; 
    int counter = 0; 

    for (int i = 0; i < 5; i++) { 
     if (Integer.parseInt(x.substring(0, 1)) == (Integer.parseInt(x.substring(i, i++))) - i) { 
      counter++; 
     } 
    } 

    if (counter == 5) { 
     System.out.println("String is sequential"); 
    } 
} 
+2

別に何か他のものから私は、あなたはおそらく、私は*内部*ループ '++'インクリメントするべきではありません。 'x.substring(i、i + 1)'を意味しますか? –

+0

'x.substring'に' i ++ 'を使わないと、後でそれをインクリメントします。これはループジョブでなければなりません。単に 'i + 1'を実行し、' x.length -1 'までループするだけです。 – SomeJavaGuy

+0

しかし、' Character.getNumericValue(x.charAt(i)) 'を使うことができます。 –

答えて

3

x.substring(i, i++)は空の文字列を与える(substringに渡された値が懸念している限り)x.substring(i, i)と同じです。空の文字列にInteger.parseIntを呼び出すと、NumberFormatExceptionとなります。あなたがすべてでsubstringの使用を避けることができ

for (int i = 1; i < x.length(); i++) { // note the range change 
    // using (i,i+1) instead of gives you a single character 
    if (Integer.parseInt(x.substring(0, 1)) == (Integer.parseInt(x.substring(i, i+1)))-i) { 
     counter++; 
    } 
} 

または、:あなたの現在のループを修正するには

for (int i = 1; i < x.length(); i++) { 
    if (x.charAt(0) == x.charAt(i) - i) { 
     counter++; 
    } 
} 
0
は、このようにコードを変更し

if (Integer.parseInt(x.substring(0, 1)) == (Integer.parseInt(x.substring(i, i+1))) - i) { 

をそして、それは動作するはずです、単にStringの文字を反復処理します。

0

部分文字列を抽出してから解析して整数に戻す必要はありません。

Character.getNumericValue(x.charAt(0)) == Character.getNumericValue(x.charAt(i)) 

は、すべての文字が数字である限り、同じことを行います。文字が数字でない場合は、NumberFormatExceptionを投げることはありません。

0
 (Integer.parseInt(x.substring(i, i++))) 

これは空の文字列を返します、あなたはそれを作るために必要++

関連する問題