2013-04-10 3 views
1

Ошибка в индексе String за пределами допустимого диапазона: 0. Я, честно говоря, даже не знаю, действительно ли то, что я делаю, в первую очередь.Я продолжаю получать ошибку String за пределами границ, может ли кто-то помочь исправить мой код?

Мне нужно создать метод wholeName и начальный метод. Их имена говорят сами за себя, в значительной степени wholeName печатает имя в зависимости от того, что пользователь дает мне. Если бы они дали мне только имя и фамилию, то это все, что я верну.

Инициалы - это тот же бит. Он берет первую букву из ввода имени и возвращает только инициалы. как Джон Ли Смит будет J.L.S.

Может ли кто-нибудь помочь мне понять, что не так? Если вы не можете сказать, что я новичок.

У меня есть программа тестера, который возвращает ошибку java.lang.StringIndexoutofboundexception: индекс Строка из диапазона: 0 в java.lang.String.charAt (String.java:658) в PersonName.Initials (PersonName .java: 131) atTestPersonName2.testOneName (TestPersonName2.java:50)

import java.util.StringTokenizer; 

public class PersonName 
{ 

    private int numberOfNames ; 
    private String firstName; 
    private String middleName; 
    private String lastName; 
    private String suffixName; 


     PersonName(){ 
     firstName=""; 
     middleName=""; 
     lastName=""; 
     suffixName=""; 
     numberOfNames=0; 

    } 
    public String getFirstName(){ 

     return firstName; 
    } 
    public String getMiddleName(){ 
     return middleName; 
    } 
    public String getLastName(){ 
     return lastName; 
    } 
    public String getSuffixName(){ 
     return suffixName; 
    } 
    public void setFirstName(String f){ 
     if((f.length() == 0) && (firstName.length() == 0)){ 
      numberOfNames = numberOfNames; 
     }else if((f.length() > 0) && (firstName.length() == 0)){ 
      numberOfNames++; 
     } 
     firstName = f; 
    } 
    public void setMiddleName(String m){ 
     if((m.length() == 0) && (middleName.length() == 0)){ 
      numberOfNames = numberOfNames; 
     }else if((m.length() > 0) && (middleName.length() == 0)){ 
      numberOfNames++; 
     } 
     middleName = m; 
    } 
    public void setLastName(String l){ 
     if((l.length() == 0) && (lastName.length() == 0)){ 
      numberOfNames = numberOfNames; 
     }else if((l.length() > 0) && (lastName.length() == 0)){ 
      numberOfNames++; 
     } 
     lastName = l; 
    } 
    public void setSuffixName(String s){ 
     if((s.length() == 0) && (suffixName.length() == 0)){ 
      numberOfNames = numberOfNames; 
     }else if((s.length() > 0) && (suffixName.length() == 0)){ 
      numberOfNames++; 
     } 
     suffixName = s; 
    } 
    public int getNumberOfNames(){ 

     return numberOfNames; 
    } 
     PersonName(String wholename) 
    { firstName=""; middleName=""; lastName=""; suffixName=""; numberOfNames=0; 

     // store the name passed in to the method 
     final int MAXNAMES = 4; 
     String [] words = new String [MAXNAMES]; 
     String testname=wholename; 
     // initialize number of names found 
     int numnames=0; 
     // on each iteration remove one name 
     StringTokenizer st = new StringTokenizer(wholename); 
     while (st.hasMoreTokens()) { 
     words[numnames++]=st.nextToken(); 
    } 

    if (numnames ==1) 
     { setFirstName(words[0]);} 
    else if (numnames == 2) 
     { setFirstName(words[0]); 
     setLastName(words[1]); 
     } 
    else if (numnames == 3) 
     { setFirstName(words[0]); 
     setMiddleName(words[1]); 
     setLastName(words[2]); 
     } 
    else if (numnames == 4) 
     { setFirstName(words[0]); 
     setMiddleName(words[1]); 
     setLastName(words[2]); 
     setSuffixName(words[3]); 

     } 

    } 
    public String EntireName(){ 
     String EntireName = " "; 
     //String EntireName = getFirstName() + " " + getMiddleName() + " " + getLastName() + " " + getSuffixName(); 
     if(getNumberOfNames() == 0){ 
      EntireName = " "; 
     }else if(getNumberOfNames() == 1){ 
      EntireName = getFirstName(); 
     }else if(getNumberOfNames() == 2){ 
      EntireName = getFirstName() + " " + getMiddleName(); 
     }else if(getNumberOfNames() == 3){ 
      EntireName = getFirstName() + " " + getMiddleName() + " " + getLastName(); 
     }else { 
      EntireName = getFirstName() + " " + getMiddleName() + " " + getLastName() + " " + getSuffixName(); 
     } 
     return EntireName; 
    } 
    public String Initials(){ 
     String f = getFirstName(); 
     char fChar = f.charAt(0); 

     String m = getMiddleName(); 
     char mChar = m.charAt(0); 

     String l = getLastName(); 
     char lChar = l.charAt(0); 

     String s = getSuffixName(); 
     char sChar = s.charAt(0); 

     String initial = " "; 

      if(getNumberOfNames() == 0){ 
      initial = " "; 
     }else if(getNumberOfNames() == 1){ 
      initial = fChar + "."; 
     }else if(getNumberOfNames() == 2){ 
      initial = fChar + "." + mChar + "."; 
     }else if(getNumberOfNames() == 3){ 
      initial = fChar + "." + mChar + "." + lChar + "."; 
     } 

     //String initial = fChar + "." + mChar + "." + lChar ; 
     return initial; 
    } 
} 
+0

Что это строка, которая бросает исключение? Вы даже пытались отлаживать себя? – nhahtdh

+0

Я работаю над этим часами, так что да, я пробовал отлаживать. У меня есть программа-тестер, которая возвращает ошибку java.lang.StringIndexoutofboundexception: Индекс строки из диапазона: 0 в java.lang.String.charAt (String.java:658) в PersonName.Initials (PersonName.java:131) atTestPersonName2. testOneName (TestPersonName2.java:50) – 2013-04-10 01:39:12

+0

опубликуйте код, который вызывает ошибку, а также сообщение об ошибке, чтобы мы могли помочь вам найти причину. –

ответ

1

При вызове функции, Firstname пусто; Теперь в функции, оператор

String f = getFirstName(); 
    char fChar = f.charAt(0); 

выполняется. Поскольку f пуст (firstName = ""; сделано изначально), fChar дает это исключение.

Update это:

String s = getSuffixName(); 
    char sChar = s.charAt(0); 

    String initial = " "; 

     if(getNumberOfNames() == 0){ 
     initial = " "; 
    }else if(getNumberOfNames() == 1){ 
     String f = getFirstName(); 
     char fChar = f.charAt(0); 
     initial = fChar + "."; 
    }else if(getNumberOfNames() == 2){ 
     String f = getFirstName(); 
     char fChar = f.charAt(0); 
     String m = getMiddleName(); 
     char mChar = m.charAt(0); 
     initial = fChar + "." + mChar + "."; 
    }else if(getNumberOfNames() == 3){ 
     String f = getFirstName(); 
     char fChar = f.charAt(0); 
     String m = getMiddleName(); 
     char mChar = m.charAt(0); 
     String l = getLastName(); 
     char lChar = l.charAt(0); 
     initial = fChar + "." + mChar + "." + lChar + "."; 
    } 

Комментарий:

Обратите внимание, что в коде, если getNumberOfNames() == 1, то предполагается, что это Firstname. Убедитесь, что это всегда актуально. Если нет, вы получите сообщение об ошибке.

+1

'Когда вы вызываете функцию, firstname имеет значение null;' Скорее всего, это не так. Вы получите исключение NullPointerException, а не исключение IndexOuttOfBoundsException, если вы выберете «null». 'firstname' уже инициализируется пустым строком в конструкторе, а установка первого имени в' null' приведет к 'NullPointerException' в' setFirstName'. Ошибка вызвана 'charAt (0)', вызываемой в пустой строке. – nhahtdh

+0

Я согласен! Хорошая точка зрения. Однако обратите внимание, что firstname инициализируется как firstName = ""; Таким образом, это строка с нулевым размером. Поэтому здесь это IndexOuttOfBoundsException, а не NullPointerException. Если он не был инициализирован или был инициализирован как null, я ожидал бы NullPOinterException. –

0

Манас избил меня. Однако я хотел бы также проверить ваши методы набора (то есть. SetFirstName())

public void setFirstName(String f){ 
    if((f.length() == 0) && (firstName.length() == 0)){ 
     numberOfNames = numberOfNames; 
    }else if((f.length() > 0) && (firstName.length() == 0)){ 
     numberOfNames++; 
    } 
    firstName = f; // FIRST NAME IS SET OUTSIDE OF CONDITION, WHETHER f.length() == 0 OR NOT 
} 

Кроме того, ваш numberOfNames счетчик испорчено. Если задано только среднее имя, счетчик будет увеличиваться на 1, но будет возвращать firstName вместо середины. Попробуйте пересмотреть логику и рефакторинг кода

удачи :)

Смежные вопросы