main 函数是 Java 程序的入口点,JVM(Java 虚拟机)在启动程序时会寻找并执行这个特定的方法,它的标准签名是:
public static void main(String[] args)
args 就是我们要重点讨论的参数。
args 是什么?
args 是一个 字符串数组 (String[]) 的名称,它的全称是 "arguments"(参数),它用于接收在命令行中运行 Java 程序时传递给 main 方法的参数。
String[]: 这表明args是一个字符串类型的数组,这意味着你可以在命令行中传递多个参数,每个参数都会被当作一个字符串,并按顺序存储在这个数组中。args: 这只是这个数组的约定俗成的名称,你可以把它改成任何合法的变量名,parameters或inputArgs,但args是最通用、最被推荐的写法,因为它能让其他开发者一眼就明白其用途。
如何传递参数?
参数是在运行程序时,通过命令行传递的,基本语法如下:
java <你的类名> [参数1] [参数2] [参数3] ...
示例:
假设你有一个名为 MyApp.java 的文件,内容如下:
public class MyApp {
public static void main(String[] args) {
// 打印参数数组的长度
System.out.println("参数个数: " + args.length);
// 使用 for 循环遍历并打印所有参数
System.out.println("--- 所有参数 ---");
for (int i = 0; i < args.length; i++) {
System.out.println("参数 " + (i + 1) + ": " + args[i]);
}
}
}
编译和运行步骤:
-
编译代码:
javac MyApp.java
这会生成
MyApp.class文件。 -
运行程序并传递参数:
java MyApp hello world 123 true
预期输出:
参数个数: 4
--- 所有参数 ---
参数 1: hello
参数 2: world
参数 3: 123
参数 4: true
分析:
- JVM 启动
MyApp类。 hello被作为第一个参数,存入args[0]。world被作为第二个参数,存入args[1]。123被作为第三个参数,存入args[2]。(注意:它是一个字符串 "123",而不是整数 123)true被作为第四个参数,存入args[3]。(注意:它是一个字符串 "true",而不是布尔值 true)args.length的值是4。
参数的常见用法
通过命令行传递参数是配置程序行为的一种非常简单直接的方式。
示例:一个简单的文件复制工具
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopier {
public static void main(String[] args) {
// 检查参数数量是否正确
if (args.length != 2) {
System.out.println("用法: java FileCopier <源文件> <目标文件>");
return; // 参数不对,退出程序
}
String sourceFile = args[0];
String destFile = args[1];
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
System.out.println("文件复制成功: " + sourceFile + " -> " + destFile);
} catch (IOException e) {
System.out.println("发生错误: " + e.getMessage());
}
}
}
如何运行:
假设你有一个名为 input.txt 的文件。
java FileCopier input.txt output.txt
这个程序会检查你是否提供了两个参数(源文件和目标文件),如果没有,它会打印出用法说明,如果提供了,它就会执行文件复制操作。
重要注意事项
-
参数类型永远是
String: 所有从命令行传入的参数都会被 JVM 解析为字符串,如果你需要一个数字(如int)或布尔值(boolean),你必须手动进行类型转换。public class TypeConversion { public static void main(String[] args) { if (args.length > 0) { String strArg = args[0]; try { int intArg = Integer.parseInt(strArg); // 将字符串转为整数 System.out.println("转换后的整数: " + intArg); } catch (NumberFormatException e) { System.out.println("错误: '" + strArg + "' 不是一个有效的整数。"); } } } }运行:
java TypeConversion 100
输出:
转换后的整数: 100 -
空格的处理: 如果一个参数本身包含空格(例如一个文件路径 "My Documents"),你需要用引号将其括起来,否则 shell 会把它当作两个独立的参数。
# 错误的方式,会把 "My Documents" 当作两个参数 java MyApp My Documents # 正确的方式,会把 "My Documents" 当作一个参数 java MyApp "My Documents"
-
args可能为空: 如果运行程序时没有传递任何参数,args数组不会是null,而是一个长度为 0 的空数组 (new String[0]),在使用args之前,最好先检查args.length,如上面的文件复制工具示例所示。
在现代 IDE(如 IntelliJ IDEA, Eclipse)中如何传递参数?
在图形化开发环境中,你通常不能直接在命令行输入参数,但 IDE 提供了配置方式:
以 IntelliJ IDEA 为例:
- 打开你的
Run/Debug Configurations(通常在右上角的下拉菜单中)。 - 选择或创建一个配置,指向你的
main类。 - 在
Program arguments字段中输入你的参数,参数之间用空格隔开。 - 点击
Apply或OK保存,然后运行或调试程序。
这样,当你在 IDE 中点击 "Run" 时,程序就会带着你配置的参数启动,效果和在命令行中输入 java <类名> <参数> 一样。
