我正在学习java,我正在制作的第一个程序是Hello World。我能够打印它然后我试着玩它。据我说,下面的程序不应该编译,但它正在编译和打印Hello World。
class Hello {
// main: generate some output
public static void main(String args[]){
System.out.print(("Hello World"));
}
}
但是如果我用main方法做同样的事情,它会在编译时给我多个错误。
class Hello {
// main: generate some output
public static void main((String args[])){
System.out.print((("Hello World")));
}
}
以下是第二个程序的一些编译错误:
Hello.java:5: error: ';' expected
public static void main((String args[])){
^
Hello.java:6: error: illegal start of type
System.out.print((("Hello World")));
^
Hello.java:6: error: ';' expected
System.out.print((("Hello World")));
有人可以解释为什么第一个程序编译成功而第二个程序错误吗?
答案 0 :(得分:4)
表达式的语法允许嵌套的parantheses。
方法标题的语法不是。方法标识符之后是单个parantheses括起来的形式参数列表。
来自Java language specification, section 8.4, Method Declarations:
MethodDeclaration:
MethodHeader MethodBody
MethodHeader:
MethodModifiersopt TypeParametersopt Result MethodDeclarator Throwsopt
MethodDeclarator:
Identifier ( FormalParameterList[optional] )
答案 1 :(得分:3)
每次编写具有值的表达式时,都可以将表达式的一部分放在括号中。所以你可以说
(a + b) * c
告诉编译器在乘法之前进行加法。为了简单起见,规则允许您将括号放在表达式中的任何位置(好吧,不是任何地方,而是表达值的表达式的任何部分),即使它们不是必要。所以你可以说
a + (b * c)
或
(((a + b))) * c
或
(((a)) + (b)) * (c)
或
System.out.println(("Hello world"));
因为"Hello world"
是带有值的表达式。
但这仅适用于 表达式,因为需要添加括号的能力。在语法的其他地方,括号用于除表达式之外的其他内容(例如参数名称列表),语法不允许使用额外的括号。请注意,这意味着您可以说
max = Math.max((a),(b));
但不是
max = Math.max((a,b));
因为(a,b)
不是具有单个值的表达式。
答案 2 :(得分:0)
通过尝试添加所有这些额外的括号,您正在弄乱如何声明方法。方法声明不允许,因此您的代码无法编译。
在代码中,您正在评估事物而不是定义它们 - 额外的括号在那里评估很好,因此它不会影响代码的行为。
答案 3 :(得分:0)
这只是语法错误。在Java中,这是纠正你的课程的正确方法。
class Hello {
// main: generate some output
public static void main(String args[]){
System.out.print(("Hello World"));
}
}
在第二个上添加了无法编译的括号。语法错误。