2016-07-06 1 views
0

このエラーで他のそのような回答を調べましたが、私のコードを具体的に把握できないようです。私は、Javaを使用しています、と私は、入力として番号を入力してプログラムを作成しようとしていますし、出力として私が取得する必要があります。variable.charAt()を使用して数値を並べ替える。スレッド "main"の例外java.lang.StringIndexOutOfBoundsException:文字列インデックスが範囲外です:

example input: 1234 
The original number is 1234 
The number in reverse is 4 3 2 1 

私はこのコードが書かれている:

import java.util.Scanner; //Needed for Scanner class 

public class CoeQuiz3 
{ 
    public static void main(String[] args) 
    { 
    //establish variables 
    String ogNumber; 
    int ogNumberInt; 

    Scanner keyboard = new Scanner(System.in); //establish scanner 

    System.out.println("Enter a positive integer greater than 0."); 
    ogNumber = keyboard.nextLine(); 
    ogNumber = checknumber(ogNumber); 
    ogNumberInt = Integer.parseInt(ogNumber); 

    //print the original number 
    System.out.println("The original number is " + ogNumber); 

    //print the reverse number 
    int ogNumberLength = ogNumber.length(); 
    int digitposition, ogDigit; 
    String reverseStatement = "The number reversed is "; 

    for (digitposition = ogNumberLength; digitposition >= 0; 
     digitposition--) 
    { 
     ogDigit = ogNumber.charAt(digitposition); 
     reverseStatement += ogDigit + " "; 
    } 
    System.out.println(reverseStatement); 

コンパイルして実行しますが、エラーが発生するたびに:

The original number is 1234 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(String.java:658) at CoeQuiz3.main(CoeQuiz3.java:30)

論理的には問題はありますか?この問題は、>=>に置き換えた場合でも発生します。

+1

これは古典的な[off-by-oneエラー](https://en.wikipedia.org/wiki/Off-by-one_error)であり、ほぼ確実に重複しています。 –

+1

また、デバッガでコードをステップ実行することは、ここに投稿する前に最初に実行する必要があります。あなたは、あなたのコードが何をしているかについて多くのことを確かに学び、99%の確実性であなた自身の問題を解決するでしょう。 –

答えて

0

文字列内の利用可能な文字インデックスのうち、最も使用可能な文字インデックスを超えてアクセスしようとしています。

for (int i=ogNumber.length()-1; i >=0; i--) { 
    char chr = ogNumber.charAt(i); 
    reverseStatement += chr; 
} 
System.out.println(reverseStatement); 

しかし、これを行うためのよりよい方法は StringBuffer.reverse()メソッドを使用することです:代わりにこのループを試してみてください

String ogNumberReversed = new StringBuffer(ogNumber).reverse(); 
for (int i=0; i < ogNumberReversed.length(); ++i) { 
    char chr = ogNumberReversed.charAt(i); 
    reverseStatement += chr; 
} 
System.out.println(reverseStatement); 
0

を次のようにあなたのfor-loopを変更してください:

for (digitposition = ogNumberLength-1; digitposition >= 0; digitposition--){ 
    ogDigit = Character.getNumericValue(ogNumber.charAt(digitposition)); 
    reverseStatement += ogDigit + " "; 
} 

と見ます結果。

  1. ザ・ループのカウンタがogNumberLength-1ない ogNumberLengthから開始する必要があります:

    が追加された2つの事柄があります。これが理由です java.lang.StringIndexOutOfBoundsException

  2. ASCIIの値をnumberに変換する必要があります。そのため、 Character.getNumericValue()が使用されています。

希望すると助かります!

+0

@karamcはあなたの問題を解決しましたか? –

0

代替ソリューション:

for (digitposition = ogNumberLength; digitposition >= 0; 
    digitposition--) 
{ 
    ogDigit = ogNumber.charAt(digitposition); 
    reverseStatement += ogDigit + " "; 
} 

ループdigitposition = ogNumberLength の最初のパラメータはループ位置で文字にアクセスすることを指定し、コードのこの部分を参照

int number = 1234; 
String strReversed = new StringBuilder(String.valueOf(number)).reverse().toString().replace("", " ").trim(); 

System.out.println(strReversed); // 4 3 2 1 

Ideone example

0

文字列の長さに等しく、文字列の場合、長さは文字数に等しい(fo r。文字列 "HAPPY"の長さは5ではありません4)。しかし、String配列の最後の要素のインデックスは、文字列の長さよりも1小さい(配列はゼロインデックスされるため)。実際にはそう

あなたが番号 "1234" を入力した場合:文字列の

  • 長だから最後の要素列= 3

の= 4

  • 位置であり、あなたのコードは、最後のインデックス3の配列内の要素番号4にアクセスしようとしているので、例外です。

    あなたが代わりに

    for (digitposition = ogNumberLength - 1; digitposition >= 0; 
        digitposition--) 
    { 
        ogDigit = ogNumber.charAt(digitposition); 
        reverseStatement += ogDigit + " "; 
    } 
    

    これははその後、私は示唆しているあなたの唯一の目標であるしかし数値だけを逆転させる場合は、あなたの問題を解決するだろう(第一パラメータで-1に気づく)以下の記述する必要があります文字列を使用すると、以下の方法を使用はるかにリソースを大量に消費

    import java.util.Scanner; 
    
    class ReverseNumber 
    { 
        public static void main(String args[]) 
        { 
         int n, reverse = 0; 
    
         System.out.println("Enter the number to reverse"); 
         Scanner in = new Scanner(System.in); 
         n = in.nextInt(); 
    
         while(n != 0) 
         { 
          reverse = reverse * 10; 
          reverse = reverse + n%10; 
          n = n/10; 
         } 
    
         System.out.println("Reverse of entered number is "+reverse); 
        } 
    } 
    

    乾杯です!

  • 関連する問題