如何调试java.lang.StringIndexOutOfBoundsException:字符串索引超出范围错误?

如何调试java.lang.StringIndexOutOfBoundsException:字符串索引超出范围错误?,java,Java,我对Java编程非常陌生,在学校作业中遇到了障碍。我的程序在JGRASP中工作,不会产生任何错误。我得到了所有正确的输出。但是当我提交作业时,我得到了以下错误。我想不出是怎么回事 运行SpaceTicket程序时发生运行时错误: java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: -23.请在家测试您的程序,并在重新提交之前修复错误。(2次) 所需输入应为: 12579500s15300701209817DSpaceX-001地球到火星 代码

我对Java编程非常陌生,在学校作业中遇到了障碍。我的程序在JGRASP中工作,不会产生任何错误。我得到了所有正确的输出。但是当我提交作业时,我得到了以下错误。我想不出是怎么回事

运行SpaceTicket程序时发生运行时错误: java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: -23.请在家测试您的程序,并在重新提交之前修复错误。(2次)

所需输入应为:

12579500s15300701209817DSpaceX-001地球到火星

代码:

import java.util.Scanner;
导入java.text.DecimalFormat;
导入java.util.Random;
公共舱太空票
{
静态最终双倍学生折扣=0.25;
静态最终双倍折扣=0.35;
公共静态void main(字符串[]args)
{
扫描仪用户输入=新扫描仪(System.in);
字符串ticketCode=“”;
字符串价格=”;
字符串spaceTicket=“”;
双价格分析=0;
双倍成本=0;
int ranNum=0;
系统输出打印(“输入票据代码:”);
ticketCode=userInput.nextLine();
ticketCode=ticketCode.trim();
if(ticketCode.length()<25){
System.out.println(“***无效票证代码***”);
System.out.println(“票证代码必须至少有25
字符。”);
}
否则{
price=ticketCode.substring(0,6);
priceParse=Double.parseDouble(价格);
如果(票证代码字符(8)='s'){
成本=价格分析-(价格分析*学生折扣);
}
else if(ticketCode.charAt(8)='c'){
成本=价格分析-(价格分析*子项折扣);
}
否则{
成本=价格分析;
}
}
spaceTicket=ticketCode.substring(24,ticketCode.length());
System.out.println(“太空票:“+太空票”);
System.out.println(“”);
System.out.println(“日期:+ticketCode.substring(13,15)+”/”
+票证代码子字符串(15,17)+“/”+票证代码子字符串(17,
21)
+时间:“+ticketCode.子字符串(9,11)+”:”
+票证代码子字符串(11,13)+“座位:”
+票证代码子字符串(21,24));
DecimalFormat df=新的DecimalFormat($#,##0.00”);
priceParse=Double.parseDouble(价格);
System.out.println(“价格:”+df.format(priceParse)
+“类别:”+ticketCode.charAt(8)
+“成本:”+df.格式(成本));
随机生成器=新随机();
ranNum=生成器.nextInt(999999)+1;
系统输出打印(“奖品编号:+ranNum”);
}
}

您的错误基于子字符串方法。在调用ticketCode.substring方法之前,您可以控制ticketCode的长度。如果ticketCode的长度小于24,则会出现以下错误:字符串索引超出范围:-23

如果
ticketCode.length()<25

if (ticketCode.length() < 25) {
     System.out.println("*** Invalid ticket code ***");
     System.out.println("Ticket code must have at least 25 
 characters.");
    return;
  }
抛出
异常


在您的情况下,票证长度看起来是1,所以
ticketCode.substring(24,1)
被称为

添加完整的stacktrace,输入是什么?您应该在'if(ticketCode.length()<25){'部分停止您的程序。您询问了如何调试此类问题。是的,重复的问题是关于稍微不同的异常,但所有建议和实践都是相同的,无论我们谈论的是数组还是字符串。
if (ticketCode.length() < 25) {
     System.out.println("*** Invalid ticket code ***");
     System.out.println("Ticket code must have at least 25 
 characters.");
    return;
  }
spaceTicket = ticketCode.substring(24, ticketCode.length());