2013-11-24 124 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

相關問題