Java Java Objects Delivering the MVP Applying a Discount Code

I am trying to throw an IllegalArgumentException to alert if something other than letters or $ is entered by the user.

Can someone help me understand why my IllegalArgumentException is not compiling.

Order.java
public class Order {
  private String itemName;
  private int priceInCents;
  private String discountCode;

  public Order(String itemName, int priceInCents) {
    this.itemName = itemName;
    this.priceInCents = priceInCents;
  }

  public String getItemName() {
    return itemName;
  }

  public int getPriceInCents() {
    return priceInCents;
  }

  public String getDiscountCode() {
    return discountCode;
  }

  private String normalizeDiscountCode(String discountCode) {
   if(((!discountCode.matches("[a-zA-Z]")) || (!discountCode.matches("$")))) {
      throw new IllegalArgrumentException("Sorry only letters or $ accepted");
   }else{
      return this.discountCode = discountCode.toUpperCase(); 
    }
  }

  public void applyDiscountCode(String discountCode) {
    this.discountCode = normalizeDiscountCode(discountCode);
  }
}
Example.java
public class Example {

  public static void main(String[] args) {
    // This is here just for example use cases.

    Order order = new Order(
            "Yoda PEZ Dispenser",
            600);

    // These are valid.  They are letters and the $ character only
    order.applyDiscountCode("abc");
    order.getDiscountCode(); // ABC

    order.applyDiscountCode("$ale");
    order.getDiscountCode(); // $ALE


    try {
      // This will throw an exception because it contains numbers
      order.applyDiscountCode("ABC123");
    } catch (IllegalArgumentException iae) {
      System.out.println(iae.getMessage());  // Prints "Invalid discount code"
    }
    try {
      // This will throw as well, because it contains a symbol.
      order.applyDiscountCode("w@w");
    }catch (IllegalArgumentException iae) {
      System.out.println(iae.getMessage());  // Prints "Invalid discount code"
    }

  }
}

2 Answers

saykin
saykin
9,820 Points

Hi, you have a spelling error in IllegalArgumentException. Also your regex needs a slight adjustment, with regex you can write it all in one If condition. This !discountCode.matches("[$a-zA-Z]+") will do the same job as both your if conditions.

What this regular expression (Regex) does is that it checks for single characters inside the bracket, but adding the + sign at the end will make it check all characters in discountCode variable.

You don't need to return this.discountCode = discountCode.toUpperCase(); in the normalizeDiscountCode method.

It's enough to to just return discountCode.toUpperCase() as discountCode will then be set to the new value in applyDiscountCode().

Also, if Craig's tests still give you a hard time after the above fixes, try changing the message "Sorry only letters or $ accepted" to "Invalid

Fab! Thank you saykin!