2015-10-16 115 views
1

我在寫一個hang子手(遊戲)程序,並且我有一個編碼的短語,以星號顯示給用戶。當用戶猜到一個正確的字母時,我試圖改變編碼的星號詞組,以便它將一個星號改爲用戶輸入字母。我使用的indexOf方法,但它不斷輸出-1,給我我能做些什麼來解決java.lang.StringIndexOutOfBoundsException?

java.lang.StringIndexOutOfBoundsException 
String index out of range -1 

下面是代碼:

System.out.print("Enter your next guess: "); 
String userGuess = keyboard.nextLine(); 

System.out.println("You guessed " + userGuess.toUpperCase() + "."); 
System.out.println(); 
if(phrase.contains(userGuess.toUpperCase())) { 

    System.out.println("This is present in the secret phrase."); 
    System.out.println(); 
    System.out.println("Number of wrong guesses so far: " + wrongGuesses); 
    int index = phrase.indexOf(userGuess); 
    System.out.print(index); 
    encodedPhrase = (encodedPhrase.substring(0, index) + userGuess + encodedPhrase.substring(index + 1)); 
+0

'phrase.indexOf(userGuess);'返回-1這意味着它沒有被發現。將其更改爲'phrase.indexOf(userGuess).toUpperCase();' –

回答

3

只是因爲字符串包含userGuess.toUpperCase()一點不意思是它也包含userGuess。如果沒有,你會得到-1。

一個簡單的修正:

String userGuess = keyboard.nextLine().toUpperCase(); 

然後你就可以刪除所有其他.toUpperCase()呼叫,該字符串已經大寫,一勞永逸。

1

userGuess可能不是你的短語的一部分,按您的說法:

int index = phrase.indexOf(userGuess); 

indexOf將返回-1,如果userGuess不是phrase一部分。因此,使用字串前面,請嘗試使用:

if (index < 0) { 
    //userGuess not part of phrase 
} else { 
    //do get substring and other business logic 
} 

而且你正在嘗試做的包含userGuess.toUpperCase(),其他的方法來避免這將是:

int index = phrase.indexOf(userGuess.toUpperCase()); 
+0

但OP已經確認猜測是在該短語中。 – NRitH

+0

我正在測試的短語是「Psycho」,每當我輸入「P」時,即使它是字符串的一部分,我仍然會得到這個錯誤。 – Hector

+0

@Hector您應該將字符串轉換爲大寫,然後對上部字符串執行'indexOf'。 NRitH,我已經回答了。 – SMA

1

如果我理解正確,你的短語是在首都。

檢查userguess if(phrase.contains(userGuess.toUpperCase()))時,您將其轉換爲大寫,但在檢查索引int index = phrase.indexOf(userGuess);時,您不是。

嘗試在將userGuess轉換爲大寫之後獲取索引,如if條件中所示。

0

您驗證了大寫版本用戶猜測的是你的字符串,但後來你indexOf()檢查檢查大寫版本。將用戶的猜測轉換爲大寫,然後然後檢查它是否在字符串中,以及它的索引是什麼。

0

您必須將輸入字符和單詞轉換爲大寫或小寫。

相反的:

phrase.contains(userGuess.toUpperCase()) 

寫:

phrase.toUpperCase().contains(userGuess.toUpperCase())

相關問題