我必须做一个字符串练习,其中我必须输入一个日期,如 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
(。由于您的练习是字符串练习,因此我不会在此答案中向您展示如何操作。