2016-04-29 10 views
-3

問題コードは以下の通りです。メインメソッド全体が必要な場合は、私にお尋ねください。コードは適合しますが、期待通りに実行されません。私は、数値が範囲外であるか、ソーステキストの最後の位置(ユーザが入力する文字列)よりも大きい場合は、感嘆符を返すようにしています。長さはあらかじめ定義することはできません。例外は 'StringIndexOutOfBoundsException'です。文字列インデックスが範囲外になった場合、if else文

TDLR numはint、sourcetextは文字列、どちらも入力です。例外:コードが '!'を出力するべきとき。代わりに。

import java.util.Scanner; 

public class Temp { 

    public static void main(String[] args) { 

     Scanner sc; 
     int result, num= 0, end = -2, temp, infolost, count; 
     String word, sourcetext, answer, space= " "; 
     String sourcetext2, temp2; 
     char input, result2, chalost; 
     sc = new Scanner(System.in); 

     System.out.println("please enter sourcetext"); 
     sourcetext = sc.nextLine(); // user inputs source text 
     sourcetext = sourcetext.toLowerCase(); // converts sourcetext into lowercase      
     System.out.print("Would you like to 1 encrypt, or 2 decrypt?"); 
     answer = sc.next(); // user inputs choice 

     if (answer.equals("1")||(answer.equals("encrypt"))) { 

      System.out.println("Please enter at least one word to encrypt"); 
      word = sc.next(); // user inputs one word 

      for (int i= 0; i < word.length(); i++) { 
       temp = sourcetext.indexOf(word.charAt(i)); // uses index to convert char positions int num 
       System.out.print(space + temp + space);   
      } 
      System.out.print(space + end); 
     } 
     else if (answer.equals("2")||(answer.equals("decrypt"))) { 

      System.out.println("Please enter digits, with one space between each. End with -2");     
      while (num > -2) { 
       num = sc.nextInt(); // num to decrypt 
       if (num > -2) {  
        result2 = sourcetext.charAt(num); // num converted into characters 
        System.out.print(result2); 
       } else if (num > sourcetext.length()) { 
        System.out.print("!"); 
       } else if (num<0) { 
        System.out.print("end"); 
       } 
      } 
     } 
    } 
} 
+0

完了コード 'StringIndexOutOfBoundsException'は、文字列の範囲にないインデックスにアクセスしようとすると発生します。 –

+1

完全なコードを提供する必要があります。おそらくスタックトレースが必要です。 – Areca

+3

あなたのコードをデバッグするのではなく、スタックトレースを解釈してデバッガを使う方法を学ぶ必要があります。 – Raedwald

答えて

0

これはIndexOutOfBounds例外につながる可能性 - -1-2より大きいので - それでも範囲外...

if (num > -2){  
    result2 = sourcetext.charAt(num); // num converted into characters 
    System.out.print(sourcetext.indexOf(num)); 
} 

編集:ユーザーの入力が-2でない限り - 最初のif - 常に実行されます...あなたはおそらく再心する必要がありますkの論理がそこにある。

編集2:num-1sourcetext.charAt(num);の場合、IndexOutOfBoundsになります。

if(num == -2) { 
    System.out.print("end"); 
} else if (num >= 0 && num < sourcetext.lenght()) { 
    // index ok 
    result2 = sourcetext.charAt(num); // num converted into characters 
    System.out.print(result2); 
} else { 
    // index out of bounds 
    System.out.print("!"); 
} 
+0

あなたはこれを別の方法で言うことができますか、私はこれを理解するのに苦労しています。答えが-2以外の場合は、最初のif文を常に実行しますか?あなたが編集を見なかった場合、これは>>> System.out.print(sourcetext.indexOf(num)); <<<は間違いだったので、今度は>>> System.out.print(result2); – Button

+0

私の2番目の編集を確認してください – user0815

+0

私はあなたの答えをupvoteするには新しすぎですが、うまくいきました!だから主な問題はここだった>> if(num == -2)<<< yes?とにかく私がどこに間違っていたのかを見るためにコードを使って遊びます。時間を割いて助けてくれてありがとう。 – Button

0

このようにそれを試してみてください。

int stringLength = sourcetext.length(); 

if (num > stringLength) { 
    System.out.print("!"); 
} 
else if (num<0) { 
    System.out.print("end"); 
} 
+0

残念ながらこれは動作しません – Button

+1

あなたはエラーを通知してくれますか?値を比較するだけなので、OutOfBoundを持つべきではありません。 BTW:if(answer == 1)||(answer.equals( "encrypt"))){//数値には==を使用します。あなたのコードを見直しても、エラーメッセージが表示されます。 –

+1

ifステートメント 'else if(answer.equals( "2")||(answer.equals( "decrypt"))){'はエラーが発生した場所ではなく、ここから始まります 'else if(num> sourcetext。長さ()){ System.out.print( "!"); '文字列sourcetextの最後の位置よりも大きい数値を入力しようとしたとき。たとえば、sourcetextは「醜い」、つまり3文字の長さです.5を入力すると、感嘆符を追加する代わりにエラーがスローされます。 – Button

関連する問題