Java 数组索引超出范围-类名约定
我正在使用Mac中的终端尝试使用javac输出一些字符串。但是,有些符号似乎不起作用,例如美元符号和星号:Java 数组索引超出范围-类名约定,java,arrays,exception,terminal,Java,Arrays,Exception,Terminal,我正在使用Mac中的终端尝试使用javac输出一些字符串。但是,有些符号似乎不起作用,例如美元符号和星号: public class BirdDisplay{ public static void main(String... args){ System.out.println(args[1]); } } 然后: javac BirdDisplay.java java BirdDisplay sparrow $someBird 我得到这个错误: Exception i
public class BirdDisplay{
public static void main(String... args){
System.out.println(args[1]);
}
}
然后:
javac BirdDisplay.java
java BirdDisplay sparrow $someBird
我得到这个错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at BirdDisplay.main(BirdDisplay.java:3)
据我所知,$在类名中是可以接受的,并且是一个有效的标识符,导致此异常的原因是什么?您在shell中使用它,其中,
$
正在执行环境/shell变量替换。这与Java无关,而是shell调用流程的方式
只需用单引号引起来:
java BirdDisplay sparrow '$someBird'
请注意,使用
$
作为有效的Java标识符是不相关的,因为您没有在任何源代码中使用它-值$someBird
纯粹用作程序中的数据(或者在您阻止shell执行变量替换后将用作数据)。您是从shell使用它,其中,$
正在执行环境/shell变量替换。这与Java无关,而是shell调用流程的方式
只需用单引号引起来:
java BirdDisplay sparrow '$someBird'
请注意,使用
$
作为有效的Java标识符是不相关的,因为您没有在任何源代码中使用它-值$someBird
纯粹用作程序中的数据(或者在您阻止shell执行变量替换后将用作数据)。正如Daisy指出的那样,这是因为您正在shell中运行程序,其中$someBird
被解释为一个环境变量。由于$someBird
不是环境变量,因此shell将其替换为零,并且您有一个长度为1而不是2的命令行参数数组。因此,您的程序对args[1]
没有任何值,您得到的是java.lang.ArrayIndexOutOfBoundsException
。您可以通过运行此代码打印出args
的长度来测试这一点:
public class BirdDisplay{
public static void main(String... args){
System.out.println(args.length);
}
}
现在当你这样做的时候:
javac BirdDisplay.java
java BirdDisplay sparrow $someBird
您将看到
1
而不是Daisy指出的2
,这是因为您在shell中运行程序,其中$someBird
被解释为一个环境变量。由于$someBird
不是环境变量,因此shell将其替换为零,并且您有一个长度为1而不是2的命令行参数数组。因此,您的程序对args[1]
没有任何值,您得到的是java.lang.ArrayIndexOutOfBoundsException
。您可以通过运行此代码打印出args
的长度来测试这一点:
public class BirdDisplay{
public static void main(String... args){
System.out.println(args.length);
}
}
现在当你这样做的时候:
javac BirdDisplay.java
java BirdDisplay sparrow $someBird
您将看到
1
而不是2
,这是因为您没有使用应用程序启动命令发送预期参数。调用java BirdDisplay“arg1”或“arg2”
这是因为您没有使用应用程序启动命令发送预期参数。调用java BirdDisplay“arg1”和“arg2”