Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组索引超出范围-类名约定_Java_Arrays_Exception_Terminal - Fatal编程技术网

Java 数组索引超出范围-类名约定

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

我正在使用Mac中的终端尝试使用javac输出一些字符串。但是,有些符号似乎不起作用,例如美元符号和星号:

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”