提问人:DBG 提问时间:5/11/2023 最后编辑:DBG 更新时间:5/12/2023 访问量:93
void 方法中的 return 关键字并不总是有效 JAVA
Return keyword in void method not always working JAVA
问:
我正在用 Java 编写一个函数,该函数可以检查日期是否正常,如果执行了某些条件,则想跳转到该方法。 我读过一个类似的问题,但没有遇到与一般情况相同的麻烦,这不是我想问的。
public static void validar(String data) {
System.out.println (data);
if (data.indexOf(" ") == -1) {
System.out.println ("No hi ha separació entre data i temps");
System.out.println ("Data incorrecta" + "\n");
return;
}
else if (data.indexOf("-") == -1) {
System.out.println ("La data no conté un guions");
System.out.println ("Data incorrecta" + "\n");
return;
}
else if (data.indexOf(":") == -1) {
System.out.println ("El temps de la data no conté :'s");
System.out.println ("Data incorrecta" + "\n");
return;
}
...
当像这样完成时,这一切都有效:
2023-01-17 17:05:26
Data correcta
2023-01-1717:05:26
No hi ha separació entre data i temps
Data incorrecta
2023/01-17 17.05.26
El temps de la data no conté :'s
Data incorrecta
2023-01-17 17.05.26
El temps de la data no conté :'s
Data incorrecta
有其他条件要检查与日期相关的条件(如果日期的长度为 3 并且时间相同等等),所以我创建了一些数组。
如果我在条件的中间创建它们,例如:
if (data.indexOf(" ") == -1) {
System.out.println ("No hi ha separació entre data i temps");
System.out.println ("Data incorrecta" + "\n");
return;
}
else if (data.indexOf("-") == -1) {
System.out.println ("La data no conté un guions");
System.out.println ("Data incorrecta" + "\n");
return;
}
else if (data.indexOf(":") == -1) {
System.out.println ("El temps de la data no conté :'s");
System.out.println ("Data incorrecta" + "\n");
return;
}
String[] arrDiaHora = data.split(" ");
String diamesany = arrDiaHora[0];
String horaminutsegon = arrDiaHora[1];
String[] arrDiaMesAny = diamesany.split("-");
String strany = arrDiaMesAny[0];
String strmes = arrDiaMesAny[1];
String strdia = arrDiaMesAny[2];
String[] arrHoraMinutSegon = horaminutsegon.split(":");
String strhora = arrHoraMinutSegon[0];
String strminut = arrHoraMinutSegon[1];
String strsegon = arrHoraMinutSegon[2];
if (arrDiaHora.length != 2) {
System.out.println ("No hi ha dos blocs formats per data i temps");
System.out.println ("Data incorrecta" + "\n");
return;
}
...
数组之后的返回值不起作用,并且 get 'return' 作为 'void' 方法中的最后一条语句是不必要的。
如果我在检查条件之前创建数组,我会得到一个 ArrayIndexOutOfBoundsException
有什么帮助吗?
提前致谢!!
答:
看起来您正在尝试拆分包含日期的字符串。可能是这样的。.2023-05-11 12:25:32
与其试图重新发明轮子,不如看看其他一些选项。
选项 1:SimpleDateFormat
为什么不用为你做这项工作呢?这种方法从一开始就存在,并且做得很好。 将尝试根据您定义的模式解析日期。如果解析失败,将抛出已检查的异常。SimpleDateFormat
SimpleDateFormat
public static void validar(String data)
{
DateFormat format = new SimpleDateFormat("yyyy-MM-dd h:mm:ss");
try
{
format.parse(data);
}
catch (ParseException e)
{
System.out.println(e.getMessage());
System.out.println("El format de la data és incorrecte. Comproveu que la data coincideixi amb el format correcte " +
"de \"AAAA-MM-DD hh:mm:ss\"");
}
}
这样,您就无需担心所有复杂的逻辑。相反,您尝试分析日期,如果分析失败,则日期验证失败。
选项 2:简单正则表达式
如果您不关心实际对应于有效日期的数字,而只关心它们与您期望的格式匹配,那么您可以通过简单的模式匹配来实现这一点。
public static void validarRegex(String data)
{
Pattern pattern = Pattern.compile("^\\d{4}\\-\\d{2}\\-\\d{2} \\d{2}:\\d{2}:\\d{2}$");
if (!data.matches(pattern.pattern())) {
System.out.println(data);
System.out.println("El format de la data és incorrecte. Comproveu que la data coincideixi amb el format " +
"correcte " + "de \"AAAA-MM-DD hh:mm:ss\"");
}
}
选项 3:DateTimeFormatter
正如用户 Ole V.V. 所指出的,您也可以使用更新来解析字符串。这里有一句警告。这会引发未经检查的异常,因此您应该为此行为做好准备。我下面的示例没有捕获异常。你可以在这里抓住它,或者如果你愿意,可以在链条的更高位置上抓住它。DateTimeFormatter
DateTimeFormatter
public static void validar(String data)
{
System.out.println(data);
LocalDateTime.parse(data, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"));
}
选项 4:复杂正则表达式
我不建议这样做,因为由于闰年之类的原因,几乎不可能得到一张好的支票。但是,如果您想试一试,有很多例子。
选项 5:字符串分析
这基本上是你已经在做的事情,但更简洁一些。
public static void validate(String data)
{
System.out.println(data);
if (isValidDate(data)) {
String[] arrDiaHora = data.split(" ");
String diamesany = arrDiaHora[0];
String horaminutsegon = arrDiaHora[1];
String[] arrDiaMesAny = diamesany.split("-");
String strany = arrDiaMesAny[0];
String strmes = arrDiaMesAny[1];
String strdia = arrDiaMesAny[2];
String[] arrHoraMinutSegon = horaminutsegon.split(":");
String strhora = arrHoraMinutSegon[0];
String strminut = arrHoraMinutSegon[1];
String strsegon = arrHoraMinutSegon[2];
if (arrDiaHora.length != 2) {
System.out.println("No hi ha dos blocs formats per data i temps");
System.out.println("Data incorrecta" + "\n");
}
}
}
public static boolean isValidDate(String data)
{
boolean valid = true;
if (!data.contains(" ")) {
invalidData("No hi ha separació entre data i temps");
valid = false;
}
else if (!data.contains("-")) {
invalidData("La data no conté un guions");
valid = false;
}
else if (!data.contains(":")) {
invalidData("El temps de la data no conté :'s");
valid = false;
}
return valid;
}
public static void invalidData(String message)
{
System.out.println(message);
System.out.println("Data incorrecta" + "\n");
}
评论
我们在 java.time
、现代 Java 日期和时间 API 及其 .我同意不重新发明轮子(除非作为练习)。此外,您的代码不会像 OP 的代码那样进行验证,因此缺少重点。SimpleDateFormat
DateTimeFormatter
LocalDateTime.parse(data, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"))
DateTimeFormatter
DateTimeParseException
LocalDateTime.parse()
ParseException
RuntimeException
另一个答案很好地描述了验证日期的更好方法。
恕我直言,它未能解决您的问题:为什么 IntelliJ IDEA 在您的一些 return 语句上报告“'return' 是不必要的,因为'void' 方法中的最后一个语句”?
为了解释这一点,我把你的例子简化为:
public static void validar(int n) {
System.out.println(n);
if (n == 3) {
System.out.println("a");
return; // Note 1
} else if (n == 5) {
System.out.println("b");
return; // Note 1
}
int x = n * n;
if (x == 4) {
System.out.println("c");
return; // Note 2
} else if (x == 16) {
System.out.println("c");
return; // Note 2
}
}
我在 return 语句中添加了两个通知:
注 1:需要这些位置的语句才能提前退出该方法。如果没有这些语句,该方法的其余部分也将执行。因此,IntelliJ IDEA 在这些网站上没有报告return;
return;
注 2:在这些语句之后,没有更多可能执行的语句。因此,它们是不必要的。它们是 - 链分支中的最后一个语句,该链之后没有更多的语句。这意味着该方法的执行无论如何都会在执行前面的语句后结束。对于这些语句,IntelliJ IDEA 报告“'return' 作为 'void' 方法中的最后一个语句是不必要的。return;
if
else if
return;
请注意,这是一条信息性消息:它的目的是帮助您编写更好(更干净)的代码。这并不意味着你的代码有问题(即,这并不意味着你的代码不会编译或会有错误。
您可以将该简化的代码(不更改其可观察行为)更改为
public static void validar(int n) {
System.out.println(n);
if (n == 3) {
System.out.println("a");
return; // Note 1
} else if (n == 5) {
System.out.println("b");
return; // Note 1
}
int x = n * n;
if (x == 4) {
System.out.println("c");
} else if (x == 16) {
System.out.println("c");
}
}
评论
void
return;