【解決方法】Java.lang.stringindexoutofboundsexception: 開始 3、終了 2、長さ 10

プログラミングQA


私は問題を解決しようとしていました。
問題のリンク: 問題 – B – コードフォース[^]

私は論理的に問題を解決しました。 しかし、Java インデックス バウンド チェックで問題が発生しています。 indexOutOfBound を回避するために、追加の if ステートメントを作成しました。 以前も同じ方法でバインドチェックの問題を解決しましたが(ifステートメントを追加)、今回は機能しません。

エラー メッセージ:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 3, end 2, length 10
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4604)
	at java.base/java.lang.String.substring(String.java:2707)
	at pac1.Simple1.main(Simple1.java:20)

私が試したこと:

<pre>package pac1;
import java.util.Scanner;
import java.lang.String;
public class Simple1{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		while(t-->0) {
			int n = sc.nextInt();
			sc.nextLine();
			String str = sc.nextLine();
			boolean check = false;
			
			if(n>2) {
				
				for(int i=0; i<n-2; i++) {
					
					for(int j=i+2; j<n-1; j++) {
						if(i+1<n && j+1<n) //StringIndex Bound..additional if statement
							if(str.substring(i, 2) == str.substring(j,2)) {
								check = true;
								break;
							}
						
					}
				}
			}
			if(check) System.out.println("YES");
			else System.out.println("NO");
		}
		
	}
}

解決策 1

問題は単純です。部分文字列操作の 1 つが機能するには文字列の長さが足りません。

ただし、原因はより複雑です。入力した正確な文字列と数値に依存し、それらにアクセスできないため、修正することはできません。

だから、それはあなた次第になるでしょう。
幸いなことに、何が起こっているのかを調べるのに役立つツール、デバッガーを利用できます。 使用方法はコンパイラ システムによって異なりますが、IDE と「デバッガ」の名前を Google で検索すると、必要な情報が得られます。

関数の最初の行にブレークポイントを置き、デバッガーでコードを実行します。 次に、コードとデータを見て、何が起こるべきかを手動で解決します。 次に、各行を 1 ステップ実行して、予想どおりの動作を確認します。 そうでない場合は、問題が発生したときであり、後戻りして (またはもう一度実行して詳しく調べて) 原因を突き止めることができます。

正確には何が入っていますか strni、 と j 部分文字列が失敗したとき? わかりませんが、それがわかれば、なぜそれが間違っているのかを調べ始めることができます。

申し訳ありませんが、私たちはあなたにそれを行うことはできません – 新しい (そして非常に便利な) スキルを学ぶ時が来ました: デバッグ!

コメント

タイトルとURLをコピーしました