【问题标题】:Integer return types in JavaJava中的整数返回类型
【发布时间】:2015-12-22 15:34:26
【问题描述】:

所以我有一个关于 Java 的小问题。

所以在 C 中,一些方法(尤其是 main)看起来像这样:

int main(){
    printf("Test");
    return 0;
}

这里的一些 C 开发人员可能知道的 int 返回类型显示方法是否返回错误,返回 0 表示没有错误。所以我想,好吧,如果我在 Java 中做这样的事情作为一种方法:

public int test(){
    return 0;
}

整数返回是否表明有/没有返回错误?

【问题讨论】:

  • C 不支持方法main 是一个函数。这不是正确的签名。也没有关于标准返回值的含义的定义。然而,大多数操作系统通常只定义负值来表示错误,唯一的约定是0 表示“正常终止”。

标签: java c return return-type


【解决方案1】:

在C中main的返回值被复制到进程的退出码值中。

在 Java 中,JVM 确实是在运行,它只是根据您提供给命令行的类中的 public static void main(String[] args) 方法“启动”用户提供的一组类。

所以你的课程实际上并没有退出,java 程序退出了。也就是说,有一种方法可以让java 程序返回一个特定的退出代码。您调用System.exit(5)java 将退出,退出代码为5

请注意,退出代码通常不可移植。以C 为例,要成功退出,您应该使用EXIT_SUCCESS 而不是0。虽然它们在许多平台上都是相同的,但 EXIT_SUCCESS 被定义为与环境匹配。

某些系统不支持退出代码(很少见)。成功的退出代码可以不同于 0(同样相对罕见)。 Java 避免了所有这些,因为它提倡抛出异常,而不是报告错误代码。也就是说,有时要与其他系统集成,您确实需要发出退出代码。只是不要认为它是一种非常“java”的做事方式。到达 JVM 堆栈顶部的异常会提供堆栈跟踪转储,这通常比任何退出代码都更容易找到并解决问题。

【讨论】:

    【解决方案2】:

    整数返回是否表明有/没有返回错误?

    完全取决于调用它的函数打算如何使用该值。一个整数返回值可以用于错误代码,也可以用于 count 个事物(字符串的长度、树中的元素数、shabazzes frobbed),或者它可以指示标尺上的值(温度、海拔、美元等)。

    在某些情况下,0 的值是 带外 值(对于给定域无效,例如 C 样式字符串末尾的零终止符或空指针)。在其他情况下,它是一个完全有效的数据值(温度、海拔、航向)。

    请注意,在 Java 中 main 返回 void,而不是 int。 Java 检测和处理错误的理念与 C 不同。

    【讨论】:

      【解决方案3】:

      整数返回是否表明有/没有返回错误?

      通常不会,尽管每个 API 设计人员都可以做出自己的选择。

      通常,在 Java 中,error 被建模为 Exception 并被抛出而不是返回。 (据我了解,现代 C++ 就是这种情况。)

      例如,如果你有一个解析整数的函数,你可能有:

      int parseInt(String str) throws NumberFormatException {
          // ...implementation
      }
      

      如果parseInt 返回,则返回成功。否则,它会抛出。你可以这样使用它:

      try {
          int value = parseInt(str);
          doSomethingWith(value);
          // more main-line code here
          // ...
      }
      catch (NumberFormatException ex) {
          // Deal with the exceptional case of an invalid input
      }
      

      Oracle 的 Java 网站上的This tutorial 详细介绍了异常和异常处理。

      现在,有时您可能有一个方法应该返回一个int 或一个指示非异常条件的标志,指示int 不可用。既然这是正常的,你期望它会发生,它不应该是一个例外,但你仍然需要以某种方式标记它。在这种情况下,一种选择是使用Integer 而不是int 并在int 不可用的非异常情况下返回nullInteger 是对应于原语int 的对象类型。 Java 的自动装箱和自动拆箱使得在这些情况下使用Integer 变得相当简单。

      最终成为“异常”或“非异常”在很大程度上是一种判断调用,因此您会看到不同的 API 设计者做的事情略有不同。

      【讨论】:

        【解决方案4】:

        你在这里混淆了一些东西。大多数操作系统上的进程都有退出代码。按照惯例,这通常表示过程的成功或错误。在 C 中,此退出代码作为入口点的返回值出现。

        此外,在 C 语言中,函数在出错时返回一些特殊值(通常为 0 或 NULL)是一种常见模式,因为没有异常可以发出信号。同样,只是一个约定。

        在 Java 中,这两种情况都相当少见。异常通常是表示意外错误情况的更好方式,并且入口点没有返回值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-16
          • 1970-01-01
          • 2013-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          相关资源
          最近更新 更多