在 Java 中执行方法子字符串时收到错误



我必须做一个字符串练习,其中我必须输入一个日期,如 dd/mm/yyyy。一切正常,除非我输入一个空格作为输入,它会打印此错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 0, end 2, length 1
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3720)
at java.base/java.lang.String.substring(String.java:1909)
at ex5.main(ex5.java:17)

这是我的代码:

import cs1.*;
public class ex5
{
public static void main(String[] args) 
{
String data = "18/08/2011";

//asking for the data
System.out.printf("DATA: ");
data = Keyboard.readString();

//system.out
System.out.printf("DIA: %s %n", data.substring(0, 2));
System.out.printf("MES: %s %n", data.substring(3, 5));
System.out.printf("ANY: %s", data.substring(6, 10)); 
}
}

输入验证中的练习

我建议您测试输入字符串的长度是否为 10。如果它更短或更长,您知道它不能具有预期的格式,因此尝试子字符串调用将毫无意义,并且可能会导致您的程序崩溃,正如您所观察到的那样。

你需要打电话给data.length().此方法将返回字符串的长度作为int,例如 10 表示18/08/2011,1 表示空格。并且您需要使用if语句来控制仅在返回的长度等于 10 时才调用substring()。您可能需要一个else部分,在其中向用户发出一条友好的消息,说明为什么不打印日、月和年。这应该足以修复您的代码。

这是一个很好的练习,因为它可以帮助你学习一些我们都必须学习的东西:验证,检查我们的输入,以确定它是否满足输入的要求,以及是否有充分的理由相信它是错误的。明确而强烈的建议是始终这样做。

正如您自己也尝试过的那样,当您的程序要求日期时,用户可以输入任何字符和任意数量的字符。可能的输入包括18/8/2011(一位数的月份,因此太短(、18 d’agost de 2011(太长(以及他们能想到的任何废话。在每种情况下,让您的程序尽可能明智地做出反应。

对于生产代码

对于生产代码,将使用标准库中的DateTimeFormatter来验证输入并将其解析为日期(LocalDate(。由于您的练习是字符串练习,因此我不会在此答案中向您展示如何操作。

相关内容

最新更新