Java中的"main"方法能返回一个字符串吗?

6

在Java中,public static void main(String[] args)返回的是void类型,而不是String类型。如果想要让它返回String类型,需要将void替换为String,并在方法内部添加return语句来返回一个字符串。

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)

无法使用相同的方法参数。方法重载是由参数类型和数量定义的,而不是由返回类型定义的。 - Braj
7
这个例外告诉你不能这样做,所以不行。 - jordan
3
问问自己,它会返回给什么,那个被返回的东西应该对此做什么? - Boann
system.exit("") - 是其中一种方式 - 更好的解释在这里 https://dev59.com/TWw05IYBdhLWcg3wnjLC - Ashish Shetkar
10个回答

7
简而言之,不行。 你可以在主方法中使用 System.out.printSystem.out.println 打印到标准输出流(stdout),但是你不能改变 main 方法的返回类型。

5
主方法的返回类型必须为void,因为Java语言规范强制执行此要求。请参见12.1.4
对于进程间通信,您可以使用以下任一方式:
  • System.inSystem.out
  • 套接字(Sockets)

2

不行,一旦主程序结束,程序就死了。所以你从那里得不到任何好处。你的目的是什么?你想实现什么?

你可以将所有内容包装在另一个方法中,并将其返回为字符串给主程序。

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

2

是的,你可以这样做,但不能运行那个类。你会收到错误提示。

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)

有点不正确。您不能使用通常的方式运行类。但是您可以编写自定义加载器来执行修改后的主函数。 - Jus12

2
不行。要成为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
}

2

这是一个非常有趣的情况。一般来说,我们可以改变任何返回void的方法,使其返回其他内容而不会有太大影响,但主方法是一个特殊情况。

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

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

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


0

如果你真的、真的需要它返回一些东西(其实你不需要),那么将输出分配给静态变量。然后你就不需要返回了。例如:

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

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

0

答案是否定的。

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


0

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

然而,尽管它的名字是main方法,但它实际上并不是一个main方法,因此在执行程序时不会被运行,就像一个真正的main方法那样。引用Java语言规范,第12.14节:

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

重点在于,你不能在Java中拥有非void的main方法。


如果在同一个类中运行,声明将具有相同的签名。 - Makoto
@Makoto,我不明白那与此有何关系。 - kviiri
如果你声明了public static void main(String[] args)public static String main(String[] args),那么这段代码将无法编译,因为两个方法的签名相同。除非解决了这个问题,否则这并不是一个完整的答案。 - Makoto
@Makoto,是的,但我没有看到关于在同一个类中拥有两个版本的“main”的问题。只是关于“main”是否可以返回“String”而不是“void”的问题,这个问题我已经回答了。 - kviiri

0
在Java之前,C或C++中的主函数可以声明为int或void。为什么呢?因为主方法是由操作系统调用的,而操作系统不负责程序的成功/失败执行。所以,为了让操作系统知道程序成功执行,我们提供了一个返回值。
现在,在Java中,程序由操作系统加载,但执行是由JRE完成的。JRE本身负责程序的成功执行。因此,无需更改返回类型。
这就像向上帝诉说你的问题,而当上帝自己给你问题时解决它们。
;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接