【问题标题】:Getting a java.lang.StringIndexOutOfBoundsException using Constructor使用构造函数获取 java.lang.StringIndexOutOfBoundsException
【发布时间】:2016-04-12 19:28:50
【问题描述】:

我的教授要求我们为一个流行的问题创建两个单独的 Java 类,您必须根据名字、姓氏和员工 ID 号构建员工电子邮件。

如果您想查看问题: Assignment

问题发生在子字符串中。我想我隐约知道为什么,但实际上我并不完全确定如何解决这个问题。

这是第一堂课:

public class EmployeeSchmidt
{
   public String FirstName = "";
   public String LastName = "";
   public String EmID = "";
   public String Email = "";

   public EmployeeSchmidt(String FirstName, String LastName, String EmID)
   {
      this.FirstName = FirstName;
      this.LastName = LastName;
      this.EmID = EmID;

      Generator();
   }

   public String getFirstName()
   {
      return FirstName;
   }

   public void setFirstName(String em)
   {
      FirstName = em;
   }

   public String getLastName()
   {
      return LastName;
   }

   public void setLastName(String em)
   {
      LastName = em;
   }

   public String getEmID()
   {
      return EmID;
   }

   public void setEmID(String em)
   {
      EmID = em;
   }

   public String getEmail()
   {
      return Email;
   }

   public void setEmail(String em)
   {
      Email = em;
   }

   String fName = (FirstName.substring(0,2));
   String lName = (LastName.substring(0,4));
   String eID = (EmID.substring(3,4));

   public void Generator()
   {
      Email = (fName + lName + eID + "@initech.com");
   }
}

还有二等:

import java.util.Scanner;
public class EmployeeInfo
{
   public static void main(String[] args)
   {
      EmployeeSchmidt em1 = new EmployeeSchmidt("","","");
      Scanner in = new Scanner (System.in);

      System.out.println("Please enter your first name.");
      em1.setFirstName(in.next());

      System.out.println("Please enter your last name.");
      em1.setLastName(in.next());

      System.out.println("Please enter your 5-digit Employee ID.");
      em1.setEmID(in.next());

      em1.Generator();

      System.out.println();
      System.out.println(em1.getFirstName());
      System.out.println(em1.getLastName());
      System.out.println(em1.getEmID());
      System.out.println("Your Employee Email is " + em1.getEmail());
   }
}

这是我得到的错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
    at java.lang.String.substring(String.java:1963)
    at EmployeeSchmidt.<init>(EmployeeSchmidt.java:57)
    at EmployeeInfo.main(EmployeeInfo.java:6)

扫描仪不是必需的,但如果我们能够做到,我们的教授会提供额外的学分。我完全迷路了。

【问题讨论】:

    标签: constructor substring java.util.scanner jgrasp


    【解决方案1】:

    有一个错误,因为您试图将名称变量子串化并将它们分配给类主体中的成员变量。不在任何方法中。因为当类被初始化时它们将是空字符串,所以抛出异常。

    将 EmployeeSchmidt java 类更改为以下。

    public class EmployeeSchmidt {
        public String FirstName = "";
        public String LastName = "";
        public String EmID = "";
        public String Email = "";
    
        public EmployeeSchmidt(String FirstName, String LastName, String EmID) {
            this.FirstName = FirstName;
            this.LastName = LastName;
            this.EmID = EmID;
    
            Generator();
        }
    
        public String getFirstName() {
            return FirstName;
        }
    
        public void setFirstName(String em) {
            FirstName = em;
        }
    
        public String getLastName() {
            return LastName;
        }
    
        public void setLastName(String em) {
            LastName = em;
        }
    
        public String getEmID() {
            return EmID;
        }
    
        public void setEmID(String em) {
            EmID = em;
        }
    
        public String getEmail() {
            return Email;
        }
    
        public void setEmail(String em) {
            Email = em;
        }
    
        public void Generator() {
            String fName = null;
            if (FirstName != null && FirstName.length() >= 2) {
                fName = (FirstName.substring(0, 2));
            }
            String lName = null;
            if (LastName != null && LastName.length()>=4) {
                lName = (LastName.substring(0, 4));
            }
            String eID = null;
            if (EmID != null && EmID.length()>=4) {
                eID = (EmID.substring(3, 4));
            }
    
            Email = (fName + lName + eID + "@initech.com");
        }
    }
    

    【讨论】:

      【解决方案2】:

      注意变量声明 fNamelNameeID 在代码中的位置:

         String fName = (FirstName.substring(0,2));
         String lName = (LastName.substring(0,4));
         String eID = (EmID.substring(3,4));
      
         public void Generator()
         {
            Email = (fName + lName + eID + "@initech.com");
         }
      

      它们在任何方法之外,因此它们是实例变量。这些初始化将在每个实例初始化时执行,在构造函数的主体之前。此时,您可以保证基本字符串都是空的(因为它们自己的优先级初始化程序)。

      也许您希望这些是Generator() 方法的局部变量。在这种情况下,它们的初始化程序在调用Generator() 之前不会运行,此时FirstNameLastNameEmID 变量将具有构造函数设置的值。

      但是请注意,即使这样也不能完全保护您免受越界字符串索引的影响。例如,考虑一个姓氏为“Wu”的员工——少于四个字符。你可以做两件事来解决这个问题:

      1. 用空格或其他字符填充字符串,以确保在计算子字符串之前它们至少与您需要的一样长(并准备好尾随空格/结果中的任何内容;例如:fName = (FirstName + "..").subString(0,2);) , 或
      2. 在尝试提取子字符串之前测试字符串长度,并在适当的情况下使用整个字符串。或者,如果字符串不够长,则失败(抛出异常)。

      【讨论】:

        【解决方案3】:

        你必须在方法中创建子字符串,因为如果它在方法之外你会创建子字符串

          FirstName = "";
          LastName = "";
          EmID = "";
          Email = "";
        

        那是你想要子串用户输入的错误 你可以让这个解决方案在方法中实现

            public String getinfo()
          { String fName = (FirstName.substring(0,2));
           String lName = (LastName.substring(0,4));
           String eID = (EmID.substring(3,4));
           Email=Generator(fName,lName,eID);
           return Email;}
        
        
        public String Generator(String fName,String lName,String eID)
           {
              Email = (fName + lName + eID + "@initech.com");
              return Email;
        

        然后在第二节课你这样做

        System.out.println("Your Employee Email is " +  em1.getinfo());
        

        之前没有生成器

        希望你能理解我

        【讨论】:

          猜你喜欢
          • 2016-03-11
          • 2014-08-02
          • 2020-06-21
          • 2019-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          • 2017-11-02
          相关资源
          最近更新 更多