main函式傳參以及陣列越界問題
阿新 • • 發佈:2018-11-21
程式執行時出現異常:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
起初呢,我只是想簡單測試一下main函式引數傳遞的問題。。。
程式碼如下:
public class Demo { public static void main(String[] args) { if(args != null) { for(int i = 0; i < args.length; i++) { System.out.print(args[i] + " "); } System.out.println(); } else { System.out.println("hello world !"); } } }
這段程式碼主要是用來測試main函式傳參的問題,當然,現在這段程式碼編譯和執行沒有任何問題,只是沒有打到原本的目的。這段程式碼的目的其實就是想在main函式有引數的時候將傳給main函式的引數輸出到控制檯,沒有的話就輸出:hello world !
有引數的執行結果如下:
然而沒有引數的執行如下:
為啥呢???
沒傳遞引數的時候args竟然不是null?直接看:
public class Demo { public static void main(String[] args) { System.out.println(args); } }
結果:[Ljava.lang.String;@50cbc42f
它真的不是null;
不能這樣判斷了。。。於是稍作修改:
public class Demo { public static void main(String[] args) { if(args[0] != null) { for(int i = 0; i < args.length; i++) { System.out.print(args[i] + " "); } System.out.println(); } else { System.out.println("hello world !"); } } }
來吧,試一下:
哎呦,可以的。再試一下 。。。
我去,這裡JVM丟擲異常:陣列越界。
趕緊思考一下,怎麼就越界了呢?
回想一下陣列越界的條件:假如定義一個數組int[] array = int[3];那麼我們只能訪問到2的索引處,因為只有123三個元素。可現在我只訪問了0元素,而陣列的地址值有不是null;為什麼不讓訪問了呢?
其實仔細想想,這和你定義了一個數組但是沒有給陣列賦值是一樣的。
public class Demo {
public static void main(String[] args) {
int[] a = {};
int length = a.length;
System.out.println(length);
System.out.println(a[0]);
}
}
結果:
陣列根本就沒有元素,你訪問元素,這不是瞎扯嗎?
於是乎繼續:
public class Demo{
public static void main(String[] args) {
args = new String[3];
if(args[0] != null) {
for(int i = 0; i < args.length; i++) {
System.out.print(args[i] + " ");
}
System.out.println();
} else {
System.out.println("hello world !");
}
}
}
這回行了吧
是的,這樣可以輸出hello world !了。。。但是我們的目的照樣不能實現。。。
我們給args陣列開闢了三個元素的空間,這樣初始化的時候會預設賦值null;可以用來判斷了,總算不會越界。
但是要想從main函式傳參來判斷是不是null顯然是不可能了。。。
換一種方式吧:
public class Demo {
public static void main(String[] args) {
if(args.length != 0) {
for(int i = 0; i < args.length; i++) {
System.out.print(args[i] + " ");
}
System.out.println();
} else {
System.out.println("hello world !");
}
}
}
這樣總算實現了。0.0