有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決
Posted on 2007-11-01 17:12 Raylong 閱讀(1158) 評(píng)論(14) 編輯 收藏 所屬分類: 感想隨筆早上看了java類庫中java.util.Arrays 類的toString方法的源代碼。如下:(這是JDK1.6的源代碼)
for循環(huán)有點(diǎn)奇怪,中間的那個(gè)表達(dá)式是空的。其實(shí)即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個(gè)效果的,純粹是多余的,但是我就是多余地加上了這條,結(jié)果編譯出錯(cuò)了!提示我沒有返回語句!
我又重新編寫了兩個(gè)小程序來驗(yàn)證一下:
下面這個(gè)能通過編譯:
下面這個(gè)就不能編譯了:
其實(shí)加上的語句并沒有改變?cè)瓉磉壿嫿Y(jié)構(gòu)。這是為什么呢?
如果在for的外面加上一個(gè)return語句,隨便返回什么字符串,又能通過編譯了!!!這個(gè)字符串永遠(yuǎn)不能輸出的!!!根本就是個(gè)擺設(shè)!!!
另外如果像下面這樣在for的中間表達(dá)式加上一個(gè)恒等式,又能通過編譯了!!!這是為什么呢?請(qǐng)高手指點(diǎn)!
附:這是JDK1.5的源碼,謝謝GrayWolf!
1.6的代碼到底比1.5的改進(jìn)在哪里呢?我覺得1.5版的實(shí)現(xiàn)比較清晰,可讀性好一點(diǎn)。
public static String toString(long[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
for循環(huán)有點(diǎn)奇怪,中間的那個(gè)表達(dá)式是空的。其實(shí)即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個(gè)效果的,純粹是多余的,但是我就是多余地加上了這條,結(jié)果編譯出錯(cuò)了!提示我沒有返回語句!
我又重新編寫了兩個(gè)小程序來驗(yàn)證一下:
下面這個(gè)能通過編譯:
class Test{
static String m(){
int a =10;
for (int i = 0; ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
for循環(huán)的中間語句是空的。static String m(){
int a =10;
for (int i = 0; ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
下面這個(gè)就不能編譯了:
class Test{
static String m(){
int a =10;
for (int i = 0; i<=a ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
static String m(){
int a =10;
for (int i = 0; i<=a ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
其實(shí)加上的語句并沒有改變?cè)瓉磉壿嫿Y(jié)構(gòu)。這是為什么呢?
如果在for的外面加上一個(gè)return語句,隨便返回什么字符串,又能通過編譯了!!!這個(gè)字符串永遠(yuǎn)不能輸出的!!!根本就是個(gè)擺設(shè)!!!
class Test{
static String m(){
int a =10;
for (int i = 0; i<=a ; i++)
if(i==a)
return "10";
return "never be touch!!!";
}
public static void main (String[] args) {
System.out.println (m());
}
}
static String m(){
int a =10;
for (int i = 0; i<=a ; i++)
if(i==a)
return "10";
return "never be touch!!!";
}
public static void main (String[] args) {
System.out.println (m());
}
}
另外如果像下面這樣在for的中間表達(dá)式加上一個(gè)恒等式,又能通過編譯了!!!這是為什么呢?請(qǐng)高手指點(diǎn)!
class Test{
static String m(){
int a =10;
for (int i = 0; true==true ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
static String m(){
int a =10;
for (int i = 0; true==true ; i++)
if(i==a)
return "10";
}
public static void main (String[] args) {
System.out.println (m());
}
}
附:這是JDK1.5的源碼,謝謝GrayWolf!
1.6的代碼到底比1.5的改進(jìn)在哪里呢?我覺得1.5版的實(shí)現(xiàn)比較清晰,可讀性好一點(diǎn)。
# public static String toString(long[] a) {
# if (a == null)
# return "null";
# if (a.length == 0)
# return "[]";
#
# StringBuilder buf = new StringBuilder();
# buf.append('[');
# buf.append(a[0]);
#
# for (int i = 1; i < a.length; i++) {
# buf.append(", ");
# buf.append(a[i]);
# }
#
# buf.append("]");
# return buf.toString();
# }
# if (a == null)
# return "null";
# if (a.length == 0)
# return "[]";
#
# StringBuilder buf = new StringBuilder();
# buf.append('[');
# buf.append(a[0]);
#
# for (int i = 1; i < a.length; i++) {
# buf.append(", ");
# buf.append(a[i]);
# }
#
# buf.append("]");
# return buf.toString();
# }