2013-11-24 2 views
1

그래서 다른 클래스의 makeCard (String info) 메서드를 호출하고 있습니다. 그것은 처음에는 통과하지만, 두 번 실행하면 StringIndexOutOfBoundsException 런타임 오류를 발생시키는 두 번 실행되는 것으로 보이는 두 번째 시간에는 문제가없는 것으로 보입니다. 자바에 익숙하지 않아 뭔가 명백한 것을 놓치고 있을지 모르지만 내 머리 속에있는 논리는 한 번 호출하면 한 번만 실행해야한다고 말합니다. 바라건대 누군가 내 실수를 지적 할 수 있습니다. 여기 한 번만 호출하면 내 메서드가 두 번 실행됩니다.

은 방법 :

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

정확한 에러 메시지를 게시 할 수 있습니까? – FaddishWorm

+0

예외 글 "AWT-EventQueue의-0"java.lang.StringIndexOutOfBoundsException : 범위 밖으로 문자열 인덱스 : 0에서 java.lang.StringBuffer.charAt \t (알 소스)에 CardBreakdown.makeCard \t (CardBreakdown.java:24) EnterCard.actionPerformed (EnterCard.java:62)에서 \t javax.swing.AbstractButton $ Handler.actionPerformed (알 수없는 소스)에서 javax.swing.AbstractButton.fireActionPerformed (알 수없는 소스) \t에서 \t있는 javax.swing에서 \t .DefaultButtonModel.fireActionPerformed (Unknown Source) – mig

+0

나는 StringBuffer를 사용하지 않을 것이다. 나는 당신이 원하는 것을 할'info.trim()'을 사용할 것이다. –

답변

0

문자열에서 공백 문자를 모두 제거하기 만하면 코드가 불필요하게 복잡합니다. 대신 :

cInfo = info.trim(); 
+0

stringbuffer에 다른 공백이 있습니다. 팁을 주셔서 감사합니다. – mig

+0

그렇다면 첫 번째 루프에서 모든 공백을 지우는 이유는 무엇입니까? 또한,'StringBuffer' 대신'StringBuilder'를 사용하십시오. – chrylis

+0

첫 번째 루프는 첫 번째 비 공백을 발견했을 때 멈추는'ltrim()'을 실행합니다. – rsp

3

내가 String.trim()에 간단한 호출 makeCard()에 두 while 루프를 대체하고있을 것 첫번째 일 - 그 기능을 선도하고 당신을 위해 후행 공백이 제거됩니다.

당신은 일반적으로 항상 예를 ​​들어,

:-) 전용 공간으로 구성 빈 문자열 또는 문자열을 처리 할 때, 오히려 치명적인 결함이있을 수 있습니다 자신의 기능, 특히 기능을 공예에 라이브러리 호출을 선호한다

문자열이 비어 있거나 비어있는 경우 루프 중 하나를 검사하지 않습니다. 이는 charAt이 몹시 불평 할 것이라는 의미입니다.

1

정보가 비어 있거나 null 인 경우 어떻게됩니까? 그런 다음 cInfo.charAt (0)는 오류를 반환합니다. 당신은 makeCard 방법의 처음에 null 또는 empty 체크를해야합니다.

+0

위의 업데이트 된 코드를 보여 줬습니다. 빈 체크는 합리적이지만 'NullPointerException'을 던집니다. 'null'입력에 대해서는 전적으로 합리적입니다. – chrylis

관련 문제