Java 我的方法运行了两次,但只调用了一次

Java 我的方法运行了两次,但只调用了一次,java,Java,因此,我从另一个类调用一个方法makeCard(stringinfo)。它第一次运行时工作正常,但第二次调用该方法时,它似乎运行了两次,这导致了StringIndexOutOfBoundsException运行时错误,我似乎不知道为什么。我对Java有点陌生,所以我可能遗漏了一些显而易见的东西,但我头脑中的逻辑告诉我,如果调用一次,它应该只运行一次。希望有人能指出我的错误 方法如下: public void makeCard(String info){ cInfo = new Strin

因此,我从另一个类调用一个方法makeCard(stringinfo)。它第一次运行时工作正常,但第二次调用该方法时,它似乎运行了两次,这导致了StringIndexOutOfBoundsException运行时错误,我似乎不知道为什么。我对Java有点陌生,所以我可能遗漏了一些显而易见的东西,但我头脑中的逻辑告诉我,如果调用一次,它应该只运行一次。希望有人能指出我的错误

方法如下:

public void makeCard(String info){
    cInfo = new StringBuffer(info);
    int i = 0;

    while(cInfo.charAt(i)== ' '){
        cInfo.deleteCharAt(i);
    }
    while(cInfo.charAt(cInfo.length()-1)== ' '){
        cInfo.deleteCharAt(cInfo.length()-1);
        i--;
    }
    seperateValues();
    makeObject();
}
这就是所谓的:

@Override
public void actionPerformed(ActionEvent e) {
    MainWindow mw = new MainWindow();
    CardBreakdown cb = new CardBreakdown();
    if("submit".equals(e.getActionCommand())){
        cb.makeCard(cardInfo.getText());
        mw.removeAddPanel();
        cardInfo.setText("");
    }
}
提前感谢您提供的任何帮助

这就是错误:
线程“AWT-EventQueue-0”java.lang.StringIndexOutOfBoundsException中出现异常:字符串索引超出范围:0

为了简单地从字符串中删除所有出现的空格字符,您的代码被不必要地卷积。相反:

cInfo = info.trim();

只需从字符串中删除所有出现的空格字符,代码就不必要地复杂了。相反:

cInfo = info.trim();
我要做的第一件事是用一个简单的调用替换
makeCard()
中的两个
while
循环-该函数将为您删除前导和尾随空格

通常,您应该更喜欢库调用,而不是手工编写自己的函数,尤其是在处理空字符串或仅包含空格的字符串时可能存在致命缺陷的函数:-)

在字符串为空或变为空的情况下,两个循环都没有进行检查,这意味着
charAt
将发出痛苦的抱怨。

我要做的第一件事是在
makeCard()中替换这两个
只需简单调用-该函数将为您删除前导和尾随空格

通常,您应该更喜欢库调用,而不是手工编写自己的函数,尤其是在处理空字符串或仅包含空格的字符串时可能存在致命缺陷的函数:-)



对于字符串为空或变为空的情况,您的两个循环都没有检查,这意味着
charAt
将发出痛苦的抱怨。

如果信息为空或为空,该怎么办?然后cInfo.charAt(0)将返回您得到的错误。您应该在makeCard方法的开始处进行空或空检查

如果信息为空或空怎么办?然后cInfo.charAt(0)将返回您得到的错误。您应该在makeCard方法的开始处进行null或空检查

您是否可以在线程“AWT-EventQueue-0”java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0位于java.lang.StringBuffer.charAt(未知源代码)处的CardBreakdown.makeCard(CardBreakdown.java:24)位于EnterCard.actionPerformed(EnterCard.java:62)在javax.swing.AbstractButton.fireActionPerformed(未知源代码)在javax.swing.AbstractButton$Handler.actionPerformed(未知源代码)在javax.swing.DefaultButtonModel.fireActionPerformed(未知源代码)我永远不会使用StringBuffer。我会使用
info.trim()
这将执行您想要的操作。您在发布的模式下无法获得该异常。发布异常堆栈跟踪和当前代码。请不要修复问题中的代码-它会使所有答案无效,并使Q/A对未来的访问者无效。您能在线程“AWT-EventQueue-0”中发布准确的错误消息吗?异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:CardBreakdown的java.lang.StringBuffer.charAt(未知源代码)为0。EnterCard.actionPerformed的makeCard(CardBreakdown.java:24)为javax.swing.AbstractButton.fireActionPerformed(未知源代码)为javax.swing.AbstractButton$Handler.actionPerformed(未知源代码)在javax.swing.DefaultButtonModel.fireActionPerformed(未知源代码)中,我永远不会使用StringBuffer
这将满足您的要求。您不会在发布的模式下收到异常。发布异常堆栈跟踪和当前代码。mig,请不要修复问题中的代码-它会使所有答案无效,并使Q/A对未来的访问者无效。我希望保留stringbuffer中的其他空间,但谢谢或者tipThen为什么第一个循环会删除其中的所有空格?另外,请使用
StringBuilder
而不是
StringBuffer
。第一个循环执行
ltrim()
当它遇到第一个非空格时停止。@mig更新了答案以执行我认为您需要的操作。@chrylis我同意更改肯定更有效,谢谢您,但我仍然收到一个错误,因为该方法在第二次调用时运行了两次,我不明白为什么它会再次运行还有其他错误我希望保留stringbuffer中的空格,但感谢tipThen为什么第一个循环会删除其中的所有空格?另外,请使用
StringBuilder
而不是
stringbuffer
。第一个循环执行
ltrim()
当它遇到第一个非空格时停止。@mig更新了答案以执行我认为您需要的操作。@chrylis我同意更改肯定更有效,谢谢,但我仍然收到一个错误,因为该方法在第二次调用时运行了两次,我不明白为什么它会再次运行空检查合理,但抛出
NullPointerException
对于
null
输入是完全合理的。空检查是合理的,但是抛出
NullPointerException
对于
null
输入是完全合理的。