Java 获取StringIndexOutOfBoundsException

Java 获取StringIndexOutOfBoundsException,java,arraylist,Java,Arraylist,这是我的代码: //Ticket parent class import java.util.ArrayList; import java.util.Scanner; import java.io.*; public class Ticket { public Ticket() {

这是我的代码:

           //Ticket parent class
            import java.util.ArrayList;
            import java.util.Scanner;
            import java.io.*;
            public class Ticket
            {
               public Ticket()
               {
                  seatArray = new ArrayList<TicketObject>();

               }
               public void loadIn()
               {
                   //generic seating for plays and concerts
                  seatArray.add(new TicketObject("A1", 40));
                  seatArray.add(new TicketObject("A2", 40));
                  seatArray.add(new TicketObject("A3", 40));
                  seatArray.add(new TicketObject("A4", 40));
                  seatArray.add(new TicketObject("A5", 40));
                  seatArray.add(new TicketObject("B1", 35));
                  seatArray.add(new TicketObject("B2", 35));
                  seatArray.add(new TicketObject("B3", 35));
                  seatArray.add(new TicketObject("B4", 35));
                  seatArray.add(new TicketObject("B5", 35));
               }
               public String getSeats(int x)
               {
                   return seatArray.get(x).getName() + "    $" + seatArray.get(x).getPrice();
               }
               protected ArrayList<TicketObject> seatArray;
            }
           //Concert ticket child class
        import java.util.ArrayList;
        import java.util.Scanner;
        import java.io.*;
        public class ConcertTicket extends Ticket
        {
           public ConcertTicket()
           {
              super();
           }
           public void loadIn()
           {
              super.loadIn();
              //Special option for concerts
              seatArray.add(new TicketObject("Backstage Pass", 100));
              seatArray.add(new TicketObject("Backstage Pass", 100)); 
              seatArray.add(new TicketObject("Backstage Pass", 100)); 
              seatArray.add(new TicketObject("Backstage Pass", 100)); 
              seatArray.add(new TicketObject("Backstage Pass", 100)); 
           }

        }
           //Play ticket child class
        import java.util.ArrayList;
        import java.util.Scanner;
        import java.io.*;
        public class PlayTicket extends Ticket
        {
           public PlayTicket()
           {
              super();
           } 
           public void loadIn()
           {
               super.loadIn();
                  //Specialized seating for plays
                  seatArray.add(new TicketObject("Box 1", 150));
                  seatArray.add(new TicketObject("Box 2", 150));
                  seatArray.add(new TicketObject("Box 3", 150));
                  seatArray.add(new TicketObject("Box 4", 150));
                  seatArray.add(new TicketObject("Box 5", 150)); 
           }
        }
    //Ticket object for each seat; also used to populate array
    public class TicketObject
    {
       public TicketObject(String inSeatName, int inSeatPrice)
       {
          seatName = inSeatName;
          seatPrice = inSeatPrice;
       }
       public String getName()
       {
           return seatName;
       }
       public int getPrice()
       {
           return seatPrice;
       }
       private String seatName;
       private int seatPrice;
    }
    //Price calculation class
    public class Calculations 
    {
        public static double addTax(int total)
        {
            return total * 1.07;
        }
    }
  //Tester class
import java.util.Scanner;
public class TicketTester
{
   public static void main(String[] args)
   {
       Scanner in = new Scanner(System.in);
    try {
      //Introduction for user
      System.out.println("Welcome to the ticket purchasing program!");
      System.out.println("You will be able to purchase either a concert or play ticket");
      System.out.println("\n");
      System.out.println("Type concert or play to display available seats and deals");
      running = true;


          //Displaying tickets of either a concert or play
          String answer = in.next();
          if (answer.equalsIgnoreCase("Concert"))
          {
                ConcertTicket journeyConcert = new ConcertTicket();
                journeyConcert.loadIn();
                System.out.println("Seat  Price");
                for(int i=0;i<15;i++)
                    {
                    System.out.println(journeyConcert.getSeats(i));
                    }
                System.out.println("\n");
                System.out.println("Type in a seat name/option and press enter to reserve it.");
                System.out.println("Type purchase and press enter to finalize your ticket purchase");  
          }
          else if(answer.equalsIgnoreCase("Play"))
          {
                PlayTicket catsPlay = new PlayTicket();
                catsPlay.loadIn();
                System.out.println("Seat  Price");
                for(int i=0;i<15;i++)
                    {
                    System.out.println(catsPlay.getSeats(i));
                    }
                System.out.println("\n");
                System.out.println("Type in a seat name/option and press enter to reserve it.");
                System.out.println("Type purchase and press enter to finalize your ticket purchase");
          }
          else
              System.out.println("Enter a valid input");

          //Adding up chosen seat numbers and costs
          while(running)
          { 
          String seatChoice = in.next();
          if ((seatChoice.substring(0,1)).equalsIgnoreCase("A") && seatChoice.length() == 2)
            {
              total = total + 40;
              seats = seats + 1;
            }
          else if ((seatChoice.substring(0,1)).equalsIgnoreCase("B")&& seatChoice.length() == 2)
            {
              total = total + 35;
              seats = seats + 1;
            }
          else if ((seatChoice.substring(0,3)).equalsIgnoreCase("Box")&& seatChoice.length() == 5)
            {
          total = total + 150;
          seats = seats + 1;
            }
          else if ((seatChoice.substring(0,14)).equalsIgnoreCase("Backstage Pass") && seatChoice.length() == 14)
            {
          total = total + 100;
          seats = seats + 1;
            }
          else if (seatChoice.equalsIgnoreCase("Purchase"))
          {
                System.out.println("You reserved " + seats + " seats at a price of $" + Calculations.addTax(total));
                running = false;
          }
          else
              System.out.println("Enter a valid input");
          }
     }
    finally {
        if(in!=null)
            in.close();
            }
    }
   private static Boolean running;
   private static int total = 0;
   private static int seats = 0;
   }
从这一点我可以看到错误发生在下面的一行,但我不知道如何解决它

else if ((seatChoice.substring(0,13)).equalsIgnoreCase("Backstage Pass") && seatChoice.length() == 14)

&&
从左到右计算语句。因此
子字符串(0,13)
可以在小于14个符号的
字符串上调用,从而导致异常。您可以通过交换长度和相等性检查来修复它:

if (seatChoice.length() == 14 && (seatChoice.substring(0, 13)).equalsIgnoreCase("Backstage Pass"))
但是,如果您检查了
length()
为14,则取
子字符串是没有意义的,因此您可以将其重写为:

if (seatChoice.equalsIgnoreCase("Backstage Pass"))

天哪,我们真的需要那么多代码来理解你的问题吗?你应该先检查长度,然后检查子字符串。非常感谢,这解决了我的问题。
if (seatChoice.equalsIgnoreCase("Backstage Pass"))