1

エラーは String index out of range: 0 です。正直なところ、自分がしていることがそもそも正しいかどうかさえわかりません。

wholeName メソッドと初期メソッドを作成する必要があります。それらの名前は、ユーザーが私に与えたものに応じて名前を出力します。彼らが私に名前と姓だけをくれたなら、それが私が返すすべてです.

イニシャルは同じビットです。名前の入力から最初の文字を取得し、イニシャルのみを返します。ジョン・リー・スミスがJLSになるように

誰が何が間違っているのか理解するのを手伝ってくれますか? あなたが言うことができないなら、私はただの初心者です.

エラー java.lang.StringIndexoutofboundexception: String index out of Range: 0 at java.lang.String.charAt(String.java:658) at 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; 
    }
}
4

2 に答える 2

1

関数を呼び出すと、firstname は空です。関数では、ステートメント

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

実行されます。f が空であるため (firstName =""; は最初に実行されています)、fChar はその例外を返します。

次のように更新します。

    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 の場合、それがファーストネームであると想定していることに注意してください。これが常に有効であることを確認してください。そうでない場合は、エラーが発生します。

于 2013-04-10T01:40:16.277 に答える
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 が返されます。ロジックを再考し、コードをリファクタリングしてみてください

幸運を :)

于 2013-04-10T01:44:09.310 に答える