运行时错误。整数转换为字符串

时间:2015-11-01 16:00:34

标签: java string int type-conversion

我目前正在创建一个程序,它返回数字的序数形式(第1个,第2个等)。但是当我运行我的程序时,我遇到了运行时错误。

我怀疑它与我从int转换为字符串有关,但我似乎无法找到问题的根源。

public void run() {
        ordinalform(5);
    }

    private String ordinalform(int num) {
        String number = Integer.toString(num);
        String correctWord ="";
        if((number.charAt(number.length()-2)=='1'
                && number.charAt(number.length()-1)=='1')){
            correctWord=number+"th";
        } else if (number.charAt(number.length()-2)=='1'
                && number.charAt(number.length()-1)=='2') {
            correctWord=number+"th";
        } else if ((number.charAt(number.length()-1)=='1'
                && number.charAt(number.length()-1)=='3')) {
            correctWord=number+"th";
        } else if(number.charAt(number.length()-1)=='1') {
            correctWord=number+"st";
        } else if(number.charAt(number.length()-1)=='2') {
            correctWord=number+"nd";
        } else if(number.charAt(number.length()-1)=='3') {
            correctWord=number+"rd";
        } else {
            correctWord=number+"th";
        }
        println(correctWord);
        return correctWord;
    }
}

错误:Exception in thread "Thread-1" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.charAt(String.java:646) at StringTraining.ordinalform(StringTraining.java:17) at StringTraining.run(StringTraining.java:11) at acm.program.Program.runHook(Program.java:1568) at acm.program.Program.startRun(Program.java:1557) at acm.program.AppletStarter.run(Program.java:1895) at java.lang.Thread.run(Thread.java:745)

2 个答案:

答案 0 :(得分:7)

修改

您正在使用数字5作为参数调用您的方法:

ordinalform(5);

ordinalform函数中执行的第一条指令:

String number = Integer.toString(num);

这会将变量num(等于5)转换为String。现在number等于“5”。请注意,number.length()现在等于1。

接下来你的情况:

if((number.charAt(number.length()-2)=='1' && ....) { }

number.length()等于1(数字==“5”)。因此,number.length() - 2将等于-1。从技术上讲,你要做的是:

if((number.charAt( -1 )=='1' && ....) { }

由于没有索引-1这样的东西,抛出StringIndexOutOfBoundsException,执行失败。

答案 1 :(得分:1)

我找到了解决方案。我需要的是在前三个循环中的额外条件。

public class StringTraining extends ConsoleProgram {

public void run() {
    ordinalform(5);
}

private String ordinalform(int num) {
    String number = Integer.toString(num);
    String correctWord ="";

    if(number.length()>1 && number.charAt(number.length()-2)=='1'
            && number.charAt(number.length()-1)=='1'){
            correctWord=number+"th";
    }else if(number.length()>1 && number.charAt(number.length()-2)=='1'
            && number.charAt(number.length()-1)=='2') {
            correctWord=number+"th";
    } else if (number.length()>1 && number.charAt(number.length()-2)=='1'
            && number.charAt(number.length()-1)=='3') {
        correctWord=number+"th";
    } else if(number.charAt(number.length()-1)=='1') {
        correctWord=number+"st";
    } else if(number.charAt(number.length()-1)=='2') {
        correctWord=number+"nd";
    } else if(number.charAt(number.length()-1)=='3') {
        correctWord=number+"rd";
    } else {
        correctWord=number+"th";
    }
    println(correctWord);
    return correctWord;
}

}