Java 测试空白时引发异常

Java 测试空白时引发异常,java,Java,我被这个问题难住了,我试图输出名字和姓氏的首字母。我正在测试具有“Mc”/“Mac”/“O'Connell”和“O'Connell”的姓氏,但空格会产生类型错误--- 完整堆栈跟踪是: run: Please enter First name :colm Please enter Last name o connell Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of

我被这个问题难住了,我试图输出名字和姓氏的首字母。我正在测试具有“Mc”/“Mac”/“O'Connell”和“O'Connell”的姓氏,但空格会产生类型错误---

完整堆栈跟踪是:

run:
Please enter First name :colm
Please enter Last name o connell
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
    at java.lang.String.charAt(String.java:646)
    at Initials2.InitialsOutput(Initials2.java:22)
    at Initials2.main(Initials2.java:51)
Java Result: 1
BUILD SUCCESSFUL (total time: 13 seconds)
下面是引发异常的代码:

import java.util.Scanner;


public class InitialsTest {

    public static void InitialsOutput(String firstName, String lastName){

    // character array to hold the initials ex hellen walsh - output HW
        char charInitials[] = new char[5]; 
        charInitials[0] = firstName.charAt(0);

        // test for different name types to output initials
        // testing for mcMahon (which works)
        // testing for o'donnell (which works)
        // testing for macDonagh (which works)
        // testing for O Connell (which fails - throws exception)
        // the first test is for  a blank space (which fails) or an ' (which works)
        if (lastName.codePointAt(1) == '\u0020' | lastName.codePointAt(1) == 39){
        //if (lastName.codePointAt(1) == 32 | lastName.codePointAt(1) == 39){
        //if (lastName.codePointAt(1) == 0020 | lastName.codePointAt(1) == 39){
        //if (lastName.charAt(1) == ' ' | lastName.codePointAt(1) == 39){

            charInitials[1] = lastName.charAt(0);
            charInitials[2] = lastName.charAt(2); 
        } else if ((lastName.charAt(0) == 'm' | lastName.charAt(0) == 'M') 
                    & (lastName.charAt(1) == 'c' | lastName.charAt(1)== 'C')){
            charInitials[1] = lastName.charAt(0);
            charInitials[2] = lastName.charAt(2);
        } else if ((lastName.charAt(0) == 'm' | lastName.charAt(0) == 'M')
                    & (lastName.charAt(1) == 'a' | lastName.charAt(1)== 'A')
                    & (lastName.charAt(2) == 'c' | lastName.charAt(2)== 'C')){
            charInitials[1] = lastName.charAt(0);
            charInitials[2] = lastName.charAt(3);
        }
        else {
            charInitials[1] = lastName.charAt(0);
        }
       String initials;
       initials = new String (charInitials);

        System.out.println("Initials are : " + initials.toUpperCase());
    }


    public static void main(String[] args) {
            Scanner userInput = new Scanner(System.in);
            System.out.print("Please enter First name :");
            String first = userInput.next();
            System.out.print("Please enter Last name ");
            String last = userInput.next(); 
            InitialsOutput(first, last);                  
    }

}

这是因为您使用的是
Scanner.next()
,它将您的姓氏分为两个标记:
o
connell
。使用
firstName=colm
lastName=o
调用方法
InitialsOutput
。这就是为什么
lastName.codepoint(1)
会给出错误


更改
userInput.next()
to
userInput.nextLine()应该可以做到这一点。

显示完整的堆栈跟踪,并指出代码中的哪一行失败。另外,查看
String.startsWith()
:-)添加一个可运行的示例。因此,我们可以复制并粘贴它。看起来
lastname
的字符少于两个。您的代码的明显问题是您正在
lastname
上进行索引访问;没有检查传入字符串的长度。(您可能希望在代码前面放一个断言;只是为了确保传入的字符串长度>=4)。顺便说一下:这个代码很可怕。在你关闭编辑器的那一刻,这种无休止的if-then-else级联就变成了“不可维护”。最好想点别的;例如正则表达式。或者至少:“大写”您的输入;至少要保存所有与小写字符的比较。作为一个建议,避免使用unicode文字,而使用
'
'\'
非常感谢,我在一百万年内永远不会得到它。现在更改程序以适应此更改和其他建议的更改“这是因为您正在使用扫描仪”不,这是因为他使用了
next
而不是
nextLine
。扫描仪本身不是问题所在。编辑后:是的,那更好:)@Tom谢谢!我及时意识到了这一点