2013-11-24 125 views
1

所以我打电话来自另一个类的方法makeCard(String info)。它在第一次运行时运行正常,但第二次我调用它似乎运行两次的方法,这会创建一个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

+0

可以发布确切的错误消息吗?在螺纹 – FaddishWorm

+0

异常 “AWT-EventQueue的-0” java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0 \t在java.lang.StringBuffer.charAt(未知来源) \t在CardBreakdown.makeCard(CardBreakdown.java:24 ) \t在EnterCard.actionPerformed(EnterCard.java:62) \t在javax.swing.AbstractButton.fireActionPerformed(来源不明) \t在javax.swing.AbstractButton中的$ Handler.actionPerformed(来源不明) \t在javax.swing中.DefaultButtonModel.fireActionPerformed(未知源) – mig

+0

我不会使用StringBuffer,永远。我会使用'info.trim()'这将做你想做的。 –

回答

0

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

cInfo = info.trim(); 
+0

stringbuffer中还有其他的空格,我希望保留,但是谢谢你的提示 – mig

+0

那么为什么第一个循环会从它中删除所有空间?另外,使用'StringBuilder'而不是'StringBuffer'。 – chrylis

+0

第一个循环在遇到第一个非空格时会停止执行'ltrim()'。 – rsp

3

第一件事我会做与一个简单的调用替换这两个while循环中makeCard()String.trim() - 该功能将删除前导和为贵尾随空白。

通常你应该总是喜欢一个库调用起草自己的函数,尤其功能,可能有一个相当致命的缺陷时,例如,处理空字符串,或者它仅包含空格:-)

对于字符串为空或变空的情况,在任一循环中都没有检查,这意味着charAt会发出怨恨抱怨。

1

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

+0

以上显示了更新的代码。空检查是合理的,但抛出'NullPointerException'对于'空'输入是完全合理的。 – chrylis

相关问题