void 方法中的 return 关键字并不总是有效 JAVA

Return keyword in void method not always working JAVA

提问人:DBG 提问时间:5/11/2023 最后编辑:DBG 更新时间:5/12/2023 访问量:93

问:

我正在用 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

有什么帮助吗?

提前致谢!!

Java 数组 返回 ArrayIndexOutofboundsException

评论

5赞 Stultuske 5/11/2023
返回;将始终结束该方法。但必须首先达到它。而且,事实上,没有必要有回报;作为最后一句话。在 void 方法中添加 return 语句的唯一用例是防止执行以下语句
2赞 rzwitserloot 5/11/2023
当你说:“数组不起作用后返回值”——这没有意义。这是一种方法。它不能返回值。您的问题不清楚;你很可能对一些概念感到困惑,这自然意味着你在这个问题中用自己的术语陈述的一堆事情是不可理解的。我建议你编辑这个问题:显示一些代码(最好是自行编译的代码),然后显示错误(异常或编译器错误 - 无论问题是什么)。如果没有错误,请显示它输出的内容,并显示您希望它输出的内容。void
1赞 aled 5/11/2023
请使用文字而不是图像。有关原因的更多详细信息,请参阅 meta.stackoverflow.com/questions/285551/...
1赞 aled 5/11/2023
除非这是学习对数据验证进行编程的练习,否则您应该使用 java.time docs.oracle.com/javase/8/docs/api/java/time/... 包中的 Java 库类来处理日期和时间。
2赞 rzwitserloot 5/12/2023
您无需重复相同的评论 3 次。 就是你怎么做的。你是 - 这不是问题。除非你按照我们的要求去做,否则你不会得到更有用的答案。帮助我们帮助您。return;

答:

0赞 tbatch 5/12/2023 #1

看起来您正在尝试拆分包含日期的字符串。可能是这样的。.2023-05-11 12:25:32

与其试图重新发明轮子,不如看看其他一些选项。

选项 1:SimpleDateFormat

为什么不用为你做这项工作呢?这种方法从一开始就存在,并且做得很好。 将尝试根据您定义的模式解析日期。如果解析失败,将抛出已检查的异常。SimpleDateFormatSimpleDateFormat

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. 所指出的,您也可以使用更新来解析字符串。这里有一句警告。这会引发未经检查的异常,因此您应该为此行为做好准备。我下面的示例没有捕获异常。你可以在这里抓住它,或者如果你愿意,可以在链条的更高位置上抓住它。DateTimeFormatterDateTimeFormatter

  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");
}

评论

0赞 Anonymous 5/12/2023
拜托,请不要教年轻人使用早已过时且臭名昭著的麻烦课程。至少不是第一选择。而且并非毫无保留。我们在 java.time、现代 Java 日期和时间 API 及其 .我同意不重新发明轮子(除非作为练习)。此外,您的代码不会像 OP 的代码那样进行验证,因此缺少重点。SimpleDateFormatDateTimeFormatter
0赞 Anonymous 5/12/2023
在实际程序中验证字符串的正确方法类似于 .LocalDateTime.parse(data, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"))
0赞 tbatch 5/12/2023
虽然我同意这在某些情况下会更好,但当它无法解析时,它会抛出运行时异常,并引入可能需要也可能不需要的额外依赖项。由于我不知道他移交日期的目的,所以我选择使用强制选中异常的格式化程序。我稍后会更新我的答案,以解决这些问题并提供替代解决方案。DateTimeFormatter
0赞 Anonymous 5/12/2023
对不起,我无法理解你的反对意见——或者也许它们不是反对意见?处理 from 的方式必须与在代码中处理的方式完全相同。它是 的子类有什么区别?而且,由于 Java 8 是内置的,因此没有额外的依赖关系。DateTimeParseExceptionLocalDateTime.parse()ParseExceptionRuntimeException
0赞 tbatch 5/12/2023
我没有提出反对意见。你的观点是有效的。我只是简单地说,我们不知道这个用例。我提供了一个替代方案,现在我提供了几个。希望这足以让@DBG朝着正确的方向前进。
2赞 Thomas Kläger 5/12/2023 #2

另一个答案很好地描述了验证日期的更好方法。

恕我直言,它未能解决您的问题:为什么 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;ifelse ifreturn;

请注意,这是一条信息性消息:它的目的是帮助您编写更好(更干净)的代码。这并不意味着你的代码有问题(即,这并不意味着你的代码不会编译或会有错误。

您可以将该简化的代码(不更改其可观察行为)更改为

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");
    }

}