当用户输入= q时尝试结束循环

时间:2017-09-30 07:18:47

标签: java

基本上我正在尝试创建Pig Latin转换器。但是,对于此分配,要求允许用户输入“Q”以退出单词输入。我可以得到要编译的代码,但每当用户输入Q时它就会崩溃并抛出:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:658)
at mission4aa.Mission4AA.main(Mission4AA.java:38)

我只是不确定哪里可以解决这个问题。我一直在努力。

import java.util.Scanner;


public class Mission4AA {

    public static void main(String[] args) {

        Scanner scanIn = new Scanner(System.in);
        String userInput;
        int firstVowel = 0;

        System.out.println("Welcome to the pig latin translator!");
        System.out.println("Please enter a word (Q to exit): ");

        do {
            userInput = scanIn.next();
            userInput = userInput.trim();
            userInput = userInput.toLowerCase();
            int end = userInput.length();

            char a = userInput.charAt(0);
            if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' )
                System.out.println(userInput + "way");

            else { //Check for next vowel if the first letter is consonant
                for (int i = 1; i < userInput.length(); i++) { 
                    char b = userInput.toLowerCase().charAt(i);
                    if (b == 'a' || b == 'e' || b == 'i' || b == 'o' || b == 'u' ) {
                        firstVowel = i; //Stores the index of the first vowel 
                        break;        
                    }
                }
                if(userInput.charAt(1) != firstVowel) {
                    String startString = userInput.substring(firstVowel, end);
                    String endString = userInput.substring(0, firstVowel) + "ay";
                    String result = startString + endString;
                    System.out.println("Translation: " + result);

                }            

            } 
            System.out.println("Enter another word(Q to exit): ");
        } while (!userInput.equalsIgnoreCase("q"));  
        System.out.println("Thank you");
    }

}

3 个答案:

答案 0 :(得分:1)

因为当你进行这项检查时

if(userInput.charAt(1) != firstVowel) {

如果用户输入'q',则userInput将只有0个术语(长度1)。您正在有效地尝试获取用户输入的第二个字符。为了解决你的问题,我会在do部分的开头检查'q'(或者简单地废弃do-while概念并使用while(true)循环)。请注意,将来您应该处理长度为1的输入。但是对于您的问题,这样的事情会起作用

do {
    userInput = scanIn.next();
    userInput = userInput.trim();
    userInput = userInput.toLowerCase();
    int end = userInput.length();

    char a = userInput.charAt(0);
    //here
    if(userInput.equals("q") || userInput.equals("Q")){
        System.out.println("Thank you");
        return;
    }
    //else continue

答案 1 :(得分:1)

如果用户只输入Qq - char index处没有1,这就是您的代码抛出java.lang.StringIndexOutOfBoundsException的原因例外。

有很多方法可以解决这个问题。就我而言,我刚刚将您的do-while转换为while(true),如果输入只是breakQ,我会使用q

// get first input
userInput = scanIn.next();
while(true){

    userInput = userInput.trim();
    userInput = userInput.toLowerCase();

    int end = userInput.length();

    char a = userInput.charAt(0);
    if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' )
        System.out.println(userInput + "way");

    else { //Check for next vowel if the first letter is consonant
        for (int i = 1; i < userInput.length(); i++) { 
            char b = userInput.toLowerCase().charAt(i);
                if (b == 'a' || b == 'e' || b == 'i' || b == 'o' || b == 'u' ) {
                    firstVowel = i; //Stores the index of the first vowel 
                    break;        
                }
        }
        if(userInput.charAt(1) != firstVowel) {
            String startString = userInput.substring(firstVowel, end);
            String endString = userInput.substring(0, firstVowel) + "ay";
            String result = startString + endString;
            System.out.println("Translation: " + result);

        }            

    }

    // check next word here - if Q or q, break out and finish
    userInput = scanIn.next();
    if(userInput.equalsIgnoreCase("q")) {
      break;
    }
    System.out.println("Enter another word(Q to exit): ");
}

注意 - 您需要相应地重新排列打印报表。

答案 2 :(得分:0)

问题似乎是你在循环开始时读取用户输入,因此do-while循环中的条件检查先前的用户输入 - 而不是新用户输入。

此外,if-statement的else分支假定输入长度至少为2个字符if(userInput.charAt(1) != firstVowel) {...}

这是因为输入"q"到达else-branch而导致异常的原因,但只是长度为1.

您需要对代码进行两处更改:

  1. 在检查loop-condition
  2. 之前,您需要阅读用户输入
  3. 在else-branch中,在检查第二个字符是否为元音之前,您必须检查输入的长度是否至少为2个字符。
  4. 以下修改后的代码:

    public static void main(String[] args) {
    
        Scanner scanIn = new Scanner(System.in);
        String userInput;
        int firstVowel = 0;
    
        System.out.println("Welcome to the pig latin translator!");
        System.out.println("Please enter a word (Q to exit): ");
        userInput = scanIn.next().trim().toLowerCase();
    
        do {
            int end = userInput.length();
    
            char a = userInput.charAt(0);
            if (a == 'a' || a == 'e' || a == 'i' || a == 'o' || a == 'u' )
                System.out.println(userInput + "way");
    
            else { //Check for next vowel if the first letter is consonant
                for (int i = 1; i < userInput.length(); i++) { 
                    char b = userInput.toLowerCase().charAt(i);
                        if (b == 'a' || b == 'e' || b == 'i' || b == 'o' || b == 'u' ) {
                            firstVowel = i; //Stores the index of the first vowel 
                            break;        
                        }
                }
                if(end > 1 && userInput.charAt(1) != firstVowel) {
                    String startString = userInput.substring(firstVowel, end);
                    String endString = userInput.substring(0, firstVowel) + "ay";
                    String result = startString + endString;
                    System.out.println("Translation: " + result);
                } else { /* Handle handle input of length 1 */} 
    
            } 
            System.out.println("Enter another word(Q to exit): ");
    
            userInput = scanIn.next().trim().toLowerCase();
    
        } while (!userInput.equalsIgnoreCase("q"));  
            System.out.println("Thank you");
      }