In Java programs, the point from where the program starts its execution or simply the entry point of Java programs is the main() method. Hence, it is one of the most important methods of Java, and having a proper understanding of it is very important.
The Java compiler or JVM looks for the main method when it starts executing a Java program. The signature of the main method needs to be in a specific way for the JVM to recognize that method as its entry point. If we change the signature of the method, the program compiles but does not execute.
The execution of the Java program, the java.exe is called. The Java.exe in turn makes Java Native Interface or JNI calls, and they load the JVM. The java.exe parses the command line, generates a new String array, and invokes the main() method. A daemon thread is attached to the main method, and this thread gets destroyed only when the Java program stops execution.
Syntax of main() Method
The most common in defining the main() method is shown in the below example.
Java
// Java Program to demonstrate the // syntax of the main() function class Lazyroar { public static void main(String[] args) { System.out.println( "I am a Geek" ); } } |
I am a Geek
Every word in the public static void main statement has got a meaning in the JVM that is described below:
1. Public
It is an Access modifier, which specifies from where and who can access the method. Making the main() method public makes it globally available. It is made public so that JVM can invoke it from outside the class as it is not present in the current class.
Java
// Java Program to demonstrate the // use of any other access modifier // other than public class Lazyroar { private static void main(String[] args) { System.out.println( "I am a Geek" ); } } |
Output
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
2. Static
It is a keyword that is when associated with a method, making it a class-related method. The main() method is static so that JVM can invoke it without instantiating the class. This also saves the unnecessary wastage of memory which would have been used by the object declared only for calling the main() method by the JVM.
Java
// Java Program to demonstrate the // error occurred when we dont use the // static keyword in the main() method class Lazyroar { public void main(String[] args) { System.out.println( "I am a Geek" ); } } |
Output
Error: Main method is not static in class test, please define the main method as:
public static void main(String[] args)
3. Void
It is a keyword and is used to specify that a method doesn’t return anything. As the main() method doesn’t return anything, its return type is void. As soon as the main() method terminates, the java program terminates too. Hence, it doesn’t make any sense to return from the main() method as JVM can’t do anything with the return value of it.
Java
// Java Program to demonstrate the // error occurred when we dont use the // void return type in the main() method class Lazyroar { public static int main(String[] args) { System.out.println( "I am a Geek" ); return 1 ; } } |
Output
Error: Main method must return a value of type void in class Main, please
define the main method as:
public static void main(String[] args)
4. main
It is the name of the Java main method. It is the identifier that the JVM looks for as the starting point of the java program. It’s not a keyword.
Java
// Java Program to demonstrate the // error occurred when we name the // main() method as main. class Lazyroar { public static void myMain(String[] args) { System.out.println( "I am a Geek" ); } } |
Output
Error: Main method not found in class, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
5. String[] args
It stores Java command-line arguments and is an array of type java.lang.String class. Here, the name of the String array is args but it is not fixed and the user can use any name in place of it.
Java
// Java Program to demonstrate // the working of String[] args // in the main() method class Lazyroar { // Commamd-Line Code -> // javac Lazyroar.java // java Lazyroar 1 2 3 public static void main(String[] args) { for (String elem : args) System.out.println(elem); } } |
Output
1
2
3
Apart from the above-mentioned signature of main, you could use public static void main(String args[]) or public static void main(String… args) to call the main function in Java. The main method is called if its formal parameter matches that of an array of Strings.
FAQs on Java main() Method
Q1. Can the main method be int? If not, why?
Ans:
Java
class
Lazyroar {
public
static
int
main(String[] args)
{
System.out.println(
"Lazyroar"
);
}
}
Output
prg1.java:6: error: missing return statement } ^ 1 error
Java does not return int implicitly, even if we declare the return type of main as int. We will get a compile-time error
Java
class
Lazyroar {
public
static
int
main(String[] args) {
System.out.println(
"Lazyroar"
);
return
0
;
}
}
Output
Error: Main method must return a value of type void in class Lazyroar, please define the main method as: public static void main(String[] args)
Now, even if we do return 0 or an integer explicitly ourselves, from int main. We get a run time error.
Explanation of the above programs:
The C and C++ programs which return int from main are processes of Operating System. The int value returned from main in C and C++ is exit code or exit status. The exit code of the C or C++ program illustrates, why the program was terminated. Exit code 0 means successful termination. However, the non-zero exit status indicates an error.
For Example exit code 1 depicts Miscellaneous errors, such as “divide by zero”.
The parent process of any child process keeps waiting for the exit status of the child. And after receiving the exit status of the child, cleans up the child process from the process table and free the resources allocated to it. This is why it becomes mandatory for C and C++ programs(which are processes of OS) to pass their exit status from the main explicitly or implicitly.
However, the Java program runs as a ‘main thread’ in JVM. The Java program is not even a process of Operating System directly. There is no direct interaction between the Java program and Operating System. There is no direct allocation of resources to the Java program directly, or the Java program does not occupy any place in the process table. Whom should it return an exit status to, then? This is why the main method of Java is designed not to return an int or exit status.
But JVM is a process of an operating system, and JVM can be terminated with a certain exit status. With help of java.lang.Runtime.exit(int status) or System.exit(int status).
Q2. Can we execute a Java program without the main method?
Ans:
No, From JDK7 main method is mandatory. The compiler will verify first, whether main() is present or not. If your program doesn’t contain the main method, then you will get an error “main method not found in the class”.
To check more about the topic refer to Is main method compulsory in Java? article.
Q3. Can we declare the main() method without String[] args?
Ans:
Yes, we can declare the main() method without String[] args. Although it will generate an error message if we directly try to execute the main method inside the driver class as done in the below example.
Java
public
class
GFG{
public
static
void
main() {
System.out.println(
"Hello, world!"
);
}
}
Output
Error: Main method not found in class GFG, please define the main method as: public static void main(String[] args) or a JavaFX application class must extend javafx.application.Application
Below is the correct method to write a program without String args[].
Java
import
java.io.*;
import
javafx.application.Application;
abstract
class
GFG
extends
javafx.application.Application {
// static block
static
{
System.out.println(
"Hello, world!"
);
System.exit(
0
);
}
}
Output
Hello, world!