混淆为什么在循环检查输入之后输入的第一个字母的边界的索引ouf为全部字母

时间:2016-08-02 21:32:14

标签: java indexoutofboundsexception

我正在努力制作猪拉丁计划: 1.如果输入的单词以辅音开头,则将该辅音放在单词的末尾并添加一个。 2.如果输入的单词以元音开头,则在末尾添加一个。

我正在使用while循环来检查输入是否都是字母,并一直询问输入。程序编译时没有错误,但是当我运行它时,在我尝试获取单词的第一个字母后,当while循环退出时说我的索引超出界限时,异常继续出现在该行,这似乎是基本但我不知道为什么这个例外即将来临

import java.util.Scanner;
public class Rev 
{
    public static void main (String[] args)
    {
        Scanner input = new Scanner(System.in);
        String vow = "aeiou";
        String ques = "Enter word";
        String reply ="";
        int counter = 0;
        String newword = "";
        boolean isword = false;
        String let = "";

        while(isword)
        {
            System.out.println(ques);
            reply = input.nextLine();
            for (int i =0;i<reply.length();i++)
            {
                let=reply.substring(i,i+1);
                if (let.matches("[a-zA-Z]")) counter++;
            }
            if (counter==reply.length()) isword=true;
        }



        String first = reply.substring(0,1);
        if (!(vow.contains(first))) newword = reply.substring(1,reply.length())+first+"ay";

        else newword = reply+"way";
        System.out.print("New word is "+newword);


    }
}

3 个答案:

答案 0 :(得分:2)

您的布尔值“isword”在开始时设置为false,因此它会完全跳过while循环。这意味着字符串“reply”是一个空字符串,其中包含零个字符,因此您无法在其上调用substring(0,1)。这将要求您的字符串“回复”至少包含一个字符。这就是导致索引越界错误的原因。

将布尔值“isword”更改为true,您将开始循环。然后更改if(counter == reply.length())将isword更改为false而不是true,并且您将跳出while循环。

答案 1 :(得分:1)

您永远不会输入while(isword)循环,因为isword为false。

由于reply仍然是一个空字符串,因此尝试从字符的字符串中获取一个字符会导致您的问题。

只需将布尔值isword初始化为true或使用do-while。

答案 2 :(得分:0)

如果您认真对待猪拉丁语翻译作为学生项目,请用适当的语言书写。您可以在Korn shell中执行此操作,例如十行代码。

虽然真实 做
打印输入字:
读WORD
如果[[$ WORD ==“^ [aeiou]”]] 然后
打印“$ {WORD} ay”
否则
INITCONS = $(echo $ WORD | sed's / ^(。)。* / \ 1 /')
REMAINDER = $(echo $ WORD | sed's /^.//')
打印“$ {REMAINDER} $ {INITCONS} ay”
科幻
完成