Java 在哪里抛出异常句柄?

Java 在哪里抛出异常句柄?,java,exception-handling,compiler-errors,Java,Exception Handling,Compiler Errors,我试图编写一个类,在用户输入实例变量的数据时进行数据验证。这个类中没有main方法,只有构造函数。用户输入在测试线束中完成。我的问题是,我是否像这里一样在set方法中进行异常处理?或者我应该试着抓住其中一个构造器 public class Customer { private String fName; private String lName; private String custTIN; private int custNbr; private int custHono

我试图编写一个类,在用户输入实例变量的数据时进行数据验证。这个类中没有main方法,只有构造函数。用户输入在测试线束中完成。我的问题是,我是否像这里一样在set方法中进行异常处理?或者我应该试着抓住其中一个构造器

public class Customer
{
  private String fName;
  private String lName;
  private String custTIN;
  private int custNbr;
  private int custHonor;

  public Customer(String first, String last, String tin, int cust, int honor)
  {
    setFName(first);
    setLName(last);
    setCustTIN(tin);
    setCustNbr(cust);
    setCustHonor(honor);
  }

  public Customer(String first, String last, int cust, String tin)
  {
    setFName(first);
    setLName(last);
    setCustTIN(tin);
    setCustNbr(cust);
  }
  /**************************************************************************************************************
    * Set & Get Methods
   **************************************************************************************************************/

  public void setFName(String first) throws InvalidCustomerException
  {
    if(first == "null")
    {
     throw new InvalidCustomerException("You did not enter any data");
    }
       else
       {
        fName = first;
       }
  }

  public void setLName(String last)
  {
   lName = last;
  }

  public void setCustTIN(String tin)
  {
   custTIN = tin;
  }

  public void setCustNbr(int cust)
  {
   custNbr = cust;
  }

  public void setCustHonor(int honor)
  {
   custHonor = honor;
  }

  public String getFName()
  {
   return fName;
  }

  public String getLName()
  {
   return lName;
  }

  public String getCustTIN()
  {
   return custTIN;
  }

  public int getCustNbr()
  {
   return custNbr;
  }

  public int getCustHonor()
  {
   return custHonor;
  }

  /****************************************************************************************************************
    * toString Methods
   ****************************************************************************************************************/
  //public String createSalutaion()
  {
  }//end createSalutation()


  public String toString()
  {
    return String.format ("%d %s %s, Customer number %d, with Tax Id: %s", getCustHonor(), getFName(), getLName(), getCustNbr(), getCustTIN());
  }//end toString()

}
这是我的异常类

/**
 * Auto Generated Java Class.
 */
public class InvalidCustomerException extends Exception
{
  private String inputValue = "null";

  public InvalidCustomerException(String message) 
  { 
   super(message);
  }

  public InvalidCustomerException(String message, Throwable cause)
  {
   super(message,
        cause);
  }

  public InvalidCustomerException(String message, String inputValue)
  {

  }

  public InvalidCustomerException(String message, String inputValue, Throwable cause)
  {

  }


} // end of invalid customer exception 

就我个人而言,我喜欢确保坏数据从一开始就不会被传递,在收集传递给构造函数的数据的任何地方都会有try捕获和抛出错误(通常是IllegalArgumentException,因为它毕竟是)


但要回答您的问题,最好尽快截获错误,以避免在依赖输入数据正确的后续函数中出现未定义的行为或垃圾输入或垃圾输出,这里的问题是,能够重新提交出错的输入。但是,由于您不直接设置实例变量,因此只要您能够从用户那里获得数据,以纠正出现的任何问题,您的设置就可以正常工作。

这取决于您与您的对象建立的契约。在大多数情况下,我可能会在这两个地方进行一些验证,因此如果对象需要一个数字,我会确保用户输入的是一个数字,但是对象可能会执行自己的验证,以确保它是一个具有给定范围的素数,作为注释,您的意思是
==null
?如果没有,(1)这是一个非常奇怪的约束,(2)您需要使用
equals