它编译但给了我一个例外

时间:2015-02-20 21:49:07

标签: java swing

该程序应该使用一个句子并返回大写字母,小写字母和数字的数量。它编译,请求输入,并返回:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 9
    at java.lang.String.charAt(Unknown Source)
    at projects.projectzero.check(projectzero.java:16)
    at projects.projectzero.main(projectzero.java:10)

package projects;

import javax.swing.JOptionPane;

public class projectzero {
    public static void main(String args[]) {
        String sentence = "", addToSentence = "";
        while (!addToSentence.equalsIgnoreCase("stop")) {
            addToSentence = JOptionPane.showInputDialog("input words or enter  stop to end program");
            sentence += addToSentence;
        }
        check(sentence);
    }

    public static void check(String input) {
        int upperCase = 0, lowerCase = 0, numbers = 0;
        for (int i = 0; i <= input.length(); i++) {
            char c = input.charAt(i);
            if (Character.isUpperCase(c))
                upperCase++;
            else if (Character.isLowerCase(c))
                lowerCase++;
            else if (Character.isDigit(c)) numbers++;
        }
        System.out.println("the number of uppercase: " + upperCase + " the number of lower case : " + lowerCase + "the number of digits is: "
                + numbers);
    }
}

出了什么问题?

3 个答案:

答案 0 :(得分:2)

String(或数组或List)中的最后一个可用索引是length() - 1,但如果{for,则不会停止i循环1}}到达length()

i到达length()之前停止迭代。将<=替换为<

for ( int i = 0 ; i < input.length() ; i++ ) {

答案 1 :(得分:0)

Java中的数组是基于零的。所以你的循环必须停在input.length()-1

for ( int i = 0 ; i < input.length() ; i++ ) {

答案 2 :(得分:0)

检查i < input.length()而不是i <= input.length()

编辑这是有效的,因为索引是从零开始的:第一个条目位于i= 0,第二个条目位于i=1,等等。因此最终条目位于{{ 1}}。