【问题标题】:Unknown Java Error未知的 Java 错误
【发布时间】:2023-03-26 16:45:02
【问题描述】:

当我尝试运行时,我输入了每日罚款并收到此错误“java.lang.stringindexoutofboundsexception string index out of range: 10 (in java.lang.String)"我不知道为什么。

import java.util.Scanner;
    public class Fines 
        {
            public static void main(String[] args) 
                {
                    //Makes the Scanner Object
                    Scanner in = new Scanner(System.in);
                    //Decoration
                    String decor = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
                    //Integers
                    int chkMonthInt;
                    int chkDayInt;
                    int chkYearInt;
                    int lateMonthInt;
                    int lateDayInt;
                    int lateYearInt;
                    int monthsLate;
                    int daysLate;
                    int yearsLate;
                    double rateDouble;
                    //Obtaining Information
                    System.out.print("Enter Last Name: ");
                    String Last = in.next();
                    System.out.print("Enter First Name: ");
                    String First = in.next();
                    System.out.print("Enter SSN: ");
                    String SSN = in.next();
                    System.out.print("Enter the title of the book: ");
                    String TitleA1 = in.next();
                    String TitleA2 = in.nextLine();
                    System.out.print("Enter the date checked out (MM/DD/YYYY): ");
                    String Date = in.next();
                    System.out.print("Enter current date (MM/DD/YYYY): ");
                    String Due = in.next();
                    System.out.print("Enter daily fine rate: ");
                    String Rate = in.next();
                    //Stringing Checkout dates
                    String chkMonth = Date.substring(0, 2);
                    String chkDay = Date.substring(3, 5);
                    String chkYear = Date.substring(6, 10);
                    //Stringing Due dates
                    String lateMonth = Due.substring(0, 2);
                    String lateDay = Due.substring(3, 5);
                    String lateYear = Due.substring(6, 10);
                    //Parsing
                    chkMonthInt = Integer.parseInt(chkMonth);
                    chkDayInt = Integer.parseInt(chkDay);
                    chkYearInt = Integer.parseInt(chkYear);
                    lateMonthInt= Integer.parseInt(lateMonth);
                    lateDayInt = Integer.parseInt(lateDay);
                    lateYearInt = Integer.parseInt(lateYear);
                    rateDouble = Double.parseDouble(Rate);
                    //Calculations
                    monthsLate = (lateMonthInt - chkMonthInt);
                    daysLate = (lateDayInt - chkDayInt);
                    yearsLate = (lateYearInt - chkYearInt);
                    //Print out the information
                    System.out.println("\n");
                    System.out.println("To: " + Last + ", " + First + "\t\tAccount: " + Last + First.substring(0, 3) + SSN.substring(6, 10));
                    System.out.println("From: Librarian");
                    System.out.println("Subject: Overdue Notice");
                    System.out.println(decor);
                    System.out.println(TitleA1 + TitleA2 + " was checked out on: " + Date);
                    System.out.println("This book is currently " + monthsLate + "/" + daysLate + "/" + yearsLate + " days late.");
                    System.out.println("Your fine has accumulated to: $" + (daysLate * rateDouble));


                }

        }

【问题讨论】:

  • 以前从未记录过此错误。
  • @SotiriosDelimanolis 如果您的评论链接到文档会更好......
  • 请遵守 Java 命名约定,变量应在 camelCase 中。您的随机大写使代码非常难以阅读(并且 SO 语法突出显示变得混乱)。

标签: java compiler-errors


【解决方案1】:

Java 是零索引的。假设您的社交是 123456789,即 0-8,因此调用 6-10 将不起作用,如果您想要最后 4 个,它将是 5-9(因为最后一个不包括在内)。还有,你需要解析一下,如果用户输入123-45-6789怎么办?

你实际上并没有显示你在哪一行得到这个,但是上面的例子显示了你所有的错误 - 到第十个子字符串,方法。

解决上述问题的方法很简单

SSN.substring(SSN.length() - 4, SSN.length())

【讨论】:

  • 他的substring 方法调用是正确的。存储的字符串太短了。
  • 我的评论是针对他将使用子字符串进入第十个,这是不正确的(因为正如您所说,字符串很短),而不是方法调用。
  • 如果他输入每日罚款后出现错误,你为什么要提到输入的社交号码(如他所说)?接下来发生的是输入日期的“拆分”。
【解决方案2】:

您确定正确填写了 Date 和 Due 字符串吗?可能是您正在尝试从不那么长的字符串中获取子字符串。 :)

更多信息可以在这里找到:http://docs.oracle.com/javase/7/docs/api/java/lang/StringIndexOutOfBoundsException.html

或者这里

Java substring : string index out of range

【讨论】:

    【解决方案3】:

    String DateString Due 之一(或两者)的长度不是 10 个字符,

    String chkMonth = Date.substring(0, 2);
    String chkDay = Date.substring(3, 5);
    String chkYear = Date.substring(6, 10); // <-- Here
    //Stringing Due dates
    String lateMonth = Due.substring(0, 2);
    String lateDay = Due.substring(3, 5);
    String lateYear = Due.substring(6, 10); // <-- and/or Here
    

    我能看到的最简单的解决方案是添加支票。

     String chkYear = (Date.length() >= 10) ? Date.substring(6, 10) : "";
     // ...
     String lateYear = (Due.length() >= 10) ? Due.substring(6, 10) : "";
    

    此外,Java 命名约定将是 String dateString due。你的方式 DateDue 看起来像类名。

    【讨论】:

      【解决方案4】:

      这意味着您正在尝试引用大于实际数组大小的数组索引。

      【讨论】:

      • 在这种情况下,它是一个字符串索引,而不是数组索引。无论如何 +1。
      猜你喜欢
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多