“线程中的异常”;“主要”;java.util.NoSuchElementException

“线程中的异常”;“主要”;java.util.NoSuchElementException,java,Java,我正在练习编写java代码,我试图解决这个问题,但我不知道如何解决它了。我会给你看我的代码 在我的Fortunecookie.java中: public class FortuneCookie { private String subjectList; private String objectList; private String verbList; private int sWord; private int oWord; private i

我正在练习编写java代码,我试图解决这个问题,但我不知道如何解决它了。我会给你看我的代码

在我的Fortunecookie.java中:

public class FortuneCookie {
    private String subjectList;
    private String objectList;
    private String verbList;
    private int sWord;
    private int oWord;
    private int vWord;
    private Random random = new Random() enter code here;

    public FortuneCookie() {
        subjectList = "I#You#He#She#It#They";
        objectList = "me#you#him#her#it#";
        verbList = "hate#love#deny#find#hear#forgive#hunt#win#teach";
    }

    public String getFortuneMsg() {
        StringTokenizer subSt = new StringTokenizer(subjectList,"#");
        StringTokenizer objSt = new StringTokenizer(objectList,"#");
        StringTokenizer verbSt = new StringTokenizer(verbList,"#");
        sWord = subSt.countTokens();
        oWord = objSt.countTokens();
        vWord = verbSt.countTokens();
        int c1 = random.nextInt(sWord);
        String line1 = " ";
        String line2 = " ";
        String line3 = " ";
        while(subSt.hasMoreTokens()) {
            line1 = subSt.nextToken("#");
            for (int i=0;i<sWord;i++)
                if (i == c1) {
                    break;
                }
                else{
                    line1 = subSt.nextToken("#");
                }
        }
        int c2 = random.nextInt(oWord);
        while(objSt.hasMoreTokens()) {
            line2 = objSt.nextToken("#");
            for (int i=0;i<sWord;i++)
                if (i == c2) {
                    break;
                }
                else{
                    line2 = objSt.nextToken("#");
                }
        }
        int c3 = random.nextInt(vWord);
        while(verbSt.hasMoreTokens()) {
            line3 = verbSt.nextToken("#");
            for (int i=0;i<sWord;i++)
                if (i == c3) {
                    break;
                }
                else{
                    line3 = verbSt.nextToken("#");
                }
        }
        return line1+line2+line3;
    }

    public void setSubjectList(String aSubjectList) {
        subjectList = aSubjectList;
    }

    public void setObjectList(String aObjectList) {
        objectList = aObjectList;
    }

    public void setVerbList(String aVerbList) {
        verbList = aVerbList;
    }

    public void print() {
        StringTokenizer subSt = new StringTokenizer(subjectList,"#");
        StringTokenizer objSt = new StringTokenizer(objectList,"#");
        StringTokenizer verbSt = new StringTokenizer(verbList,"#");
        sWord = subSt.countTokens();
        oWord = objSt.countTokens();
        vWord = verbSt.countTokens();
        System.out.println("Subject List : "+subjectList);
        System.out.println("Object List : "+objectList);
        System.out.println("Verb List : "+verbList);
    }
当我编译并运行它时:

//Exception in thread "main" java.util.NoSuchElementException
        at java.util.StringTokenizer.nextToken(Unknown Source)
        at java.util.StringTokenizer.nextToken(Unknown Source)
        at CS_111_Homework_2.FortuneCookie.getFortuneMsg(FortuneCookie.java:39)
        at CS_111_Homework_2.FortuneCookieTest.main(FortuneCookieTest.java:6)

如何解决它?

在代码的这一部分中,您可以调用
objSt.nextToken(“#”)两次,如果第一次调用得到最后一个元素,那么在第二次调用中,您将得到
NoSuchElementException
,因为没有更多的元素可用

while (objSt.hasMoreTokens()) {
    line2 = objSt.nextToken("#");
    for (int i = 0; i < sWord; i++)
        if (i == c2) {
            break;
        } else {
            line2 = objSt.nextToken("#");
        }
}
while(objSt.hasMoreTokens()){
第2行=objSt.nextToken(“#”);
for(int i=0;i

实际上,代码有几个问题,特别是这个方法
getFortuneMsg()

  • 您正在对所有循环使用
    swarm
    ,而应该对第一个循环使用
    swarm
    ,对第二个循环使用
    oWord
    ,对最后一个循环使用
    vWord

  • 另外,您正在调用
    line1=subSt.nextToken(“#”)
    在开始循环之前,您已经使用了一个令牌,这可能会产生
    NoTouchElementException
    我建议将此
    更改为(int i=0;感谢您的所有答案。我现在可以解决。再次感谢。:)感谢您的所有答案。我现在可以解决它。再次感谢您。:)
    
    while (objSt.hasMoreTokens()) {
        line2 = objSt.nextToken("#");
        for (int i = 0; i < sWord; i++)
            if (i == c2) {
                break;
            } else {
                line2 = objSt.nextToken("#");
            }
    }
    
     public String getFortuneMsg() {
    
        StringTokenizer[] tokenizers = {new StringTokenizer(subjectList, "#"), new StringTokenizer(objectList, "#"), new StringTokenizer(verbList, "#")};
    
        StringBuilder sb = new StringBuilder();
        for (StringTokenizer tokenizer : tokenizers) {
    
            int rCount = random.nextInt(tokenizer.countTokens());
    
            for (int i = 0; i < rCount; i++) {
                tokenizer.nextToken();
            }
            sb.append(tokenizer.nextToken());
        }
        return sb.toString();
    }