【问题标题】:Can "main" in java return a String?java中的“main”可以返回一个字符串吗?
【发布时间】:2014-07-14 10:27:09
【问题描述】:

java中的public static void main(String[] args)是否有可能返回String而不是void?如果是,怎么做?

public static String main(String[] args)

代替:

public static void main(String[] args)

当我改变我的代码如下:

public static String main(String[] args) throws IOException {
    String str = null;
    TurkishMorphParser parser = TurkishMorphParser.createWithDefaults();
    str = new Stm(parser).parse("bizler");
    System.out.println("str = " + str);
    String replace = str.replace("[","");
    String replace1 = replace.replace("]","");
    List<String> result1 = new ArrayList<String>(Arrays.asList(replace1.split(",")));
    String result = result1.get(0);
    System.out.println("Result = " + result);
    return result;        
}

我收到此错误:

Error: Main method must return a value of type void in class Stm, please define the main method as:
public static void main(String[] args)

【问题讨论】:

  • 不可能使用相同的方法参数。方法重载由参数类型和计数而不是返回类型定义。
  • 例外是告诉你不能,所以不,你不能。
  • 问问自己,它会将它返回 的什么地方,以及它被返回的预期用途是什么?
  • system.exit("") - 正在进行中 - 在这里更好地解释 stackoverflow.com/questions/7130264/…

标签: java string return main


【解决方案1】:

简而言之 - 不,它不能。 您始终可以从 main 方法打印到标准输出(使用 System.out.printSystem.out.println),但您不能更改 main 的返回类型。

【讨论】:

    【解决方案2】:

    main 方法的返回类型必须是void,因为java 语言规范强制它。见12.1.4

    对于进程间通信,您可以使用:

    • System.inSystem.out
    • 套接字

    【讨论】:

      【解决方案3】:

      不,你不能......一旦主程序完成,程序就死了......所以你没有任何好处......你的目的是什么?你想达到什么目的?

      您可以将所有内容包装在其他将 String 返回到您的 main 的方法中。

      public static void main(String[] args) throws IOException {
         String result = doSomething();
      return result;
      
      
      }
      public static String doSomething() {
         String str = null;
         TurkishMorphParser parser = TurkishMorphParser.createWithDefaults();
         str = new Stm(parser).parse("bizler");
         System.out.println("str = " + str);
         String replace = str.replace("[","");
         String replace1 = replace.replace("]","");
         List<String> result1 = new ArrayList<String>(Arrays.asList(replace1.split(",")));
         String result = result1.get(0);
         System.out.println("Result = " + result);
      }
      

      【讨论】:

        【解决方案4】:

        是的,您可以,但您不能运行该课程。你会得到错误

        class Test {
        
                public static String main(String[] args) {
                        return "1";
                }
        }
        

        你会得到错误

        Error: Main method must return a value of type void in class Test, please 
        define the main method as:
           public static void main(String[] args)
        

        【讨论】:

        • 有点不正确。您无法使用通常的方式运行课程。但是你可以编写一个自定义加载器来执行修改后的 main。
        【解决方案5】:

        没有。要成为main() 方法,它必须不返回任何内容(即void)。

        但是,如果您需要方法返回某些内容的功能,您可以重构代码:

        public static void main(String[] args) throws IOException {
            myMain(args);
        }
        
        public static String myMain(String[] args) throws IOException {
            // your method, which can now be called from anywhere in your code
        }
        

        【讨论】:

          【解决方案6】:

          这是一个非常有趣的场景。虽然一般来说,我们可以将任何返回 void 的方法更改为返回任何其他内容而不会产生太大影响,但 main 方法是一个特例。

          在早期的编程语言中,从 main 方法返回应该将退出值返回给操作系统或调用环境。

          但在 Java 的情况下(多线程概念案例),从 main 方法返回一个值是不正确的,因为 main 方法返回到 JVM 而不是 OS。然后 JVM 完成其他线程,例如守护线程(如果有)并在退出到操作系统之前执行其他退出任务。

          因此允许 main 方法返回,会导致开发人员产生错误的期望。因此这是不允许的。

          【讨论】:

            【解决方案7】:

            是的,这绝对是可能的。也就是说,你可以定义一个方法public static String main(String[] args)。就像定义任何其他方法一样。

            但是,它不会是主方法,尽管它的名称如此,因此在执行程序时不会像主方法那样运行。引用 Java 语言规范,第 12.14 节:

            main 方法必须声明为 public、static 和 void

            强调我的。 Java 中不能有非 void main 方法。

            【讨论】:

            • 如果在同一个类中运行,声明将具有相同的签名。
            • @Makoto,我不明白这与此有何关系。
            • 会的。如果您声明了public static void main(String[] args)public static String main(String[] args),则不会编译,因为这两种方法将具有相同的签名。在解决这一点之前,这不是一个完整的答案。
            • @Makoto,是的,但我不认为有两个版本的 main 在同一个类中的问题。仅关于main 是否可以返回String 而不是void,我已经回答了。
            【解决方案8】:

            如果你真的,真的需要它来返回一些东西(你不需要),将输出分配给一个静态变量。然后你就不需要回来了。即

            static String a = "";
            public static void main(String[] args){
                 //do sth
                 a = "whatever you want";
            }
            

            现在你有了String a,可以在任何你想使用的地方使用它,但我看不到它有任何用途。

            【讨论】:

              【解决方案9】:

              答案是否定的。

              当程序运行时,JVM 会查找名为 main() 的方法,该方法将字符串数组作为输入,不返回任何内容(即返回类型为 void)。但是如果它没有找到这样的方法(例如 ma​​in() 方法正在返回 String),那么它会抛出一个 java.lang.NoSuchMethodError

              【讨论】:

                【解决方案10】:

                在 java 之前,在 C 或 C++ 中,主函数可以声明为 int 或 void。为什么?因为主要方法是由操作系统调用的,它不负责程序的成功/不成功执行。因此,为了让操作系统知道程序执行成功,我们提供了一个返回值。

                现在,在java中,程序由OS加载,但执行由JRE完成。 JRE 本身负责程序的成功执行。因此,无需更改返回类型。

                这就像把你的问题告诉上帝,当上帝亲自给你解决问题时。

                ;)

                【讨论】:

                  猜你喜欢
                  • 2011-10-31
                  • 2014-12-11
                  • 2020-05-07
                  • 2014-01-30
                  • 2011-04-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-07
                  相关资源
                  最近更新 更多