java解惑(謎題41到謎題)

2021-08-31 05:59:10 字數 1487 閱讀 3305

[b]謎題41:域和流[/b]

下面的方法實現將乙個檔案拷貝到另乙個檔案,但它[color=red]並非總是能夠做到[/color]這一點,為什麼不能呢?如何修改?

static void copy(string src,string dest) throws ioexception

}finally

}

問題在於finally自身,close方法也可能丟擲ioexception異常。如果正好發生在in.close()呼叫之時,就會阻止out.close 的呼叫,從而使輸出流保持在開放狀態。注意,該程式違反了謎題36的建議:[color=red]對close的呼叫可能會導致finally語句塊意外結束[/color]。解決方式 是將每乙個close都包含在乙個巢狀的try語句塊中。

[b]謎題42:異常為迴圈而拋[/b]

public class loop ,,,,};

int count = 0;

try}catch(arrayindexoutofbound***ception e)

system.out.println(count);

}private static boolean thirdelemisthree(int a)

}

列印出0

這個程式犯了兩個錯誤,第1個錯誤是該程式使用了一種可怕的迴圈慣用法。不要使用異常控制迴圈;應該只為異常條件而使用異常。

為糾正這個錯誤,將整個try-finally語句塊替換為迴圈遍歷陣列的標準慣用法:

for(int i = 0;i=3 [color=red]&&[/color] a[2] ==3;

[b]謎題43:異常的危險[/b]

[b]謎題44:刪除類[/b]

[color=red]要想編寫乙個能夠探測類丟失的程式,請使用反射[/color]來引用類而不是使用通常的語言結構。如下程式展示了這種技巧:

trycatch(noclassdeffounderror ex)

[color=red]總之,不要對捕捉noclassdeffounderror形成依賴。更一般地講,捕獲error及其子型別幾乎是完全不恰當的。[/color]

謎題45:令人疲憊不堪的測試

本謎題測試你對遞迴的了解程度,下面的程式將做些什麼呢?

public class workout 

private static void workhard() finally

}}

要不是有try-finally語句,行為非常明顯:workhard遞迴呼叫自身,直到程式丟擲stackoverflowerror異常。但這個程式一直的在迴圈。因為一般vm將棧的深度限制為1024,因此,呼叫的數量就是1+2+4+。。。=2^1025-1,而丟擲異常的數量是2^1024,沒人能看到這個程式終止的時刻。

Java解惑之字元謎題(2)

11 字元相加 system.out.println h a system.out.println h a 上面兩行 列印出來的結果是不同的,第一行的結果是ha,第二行的結果是169。這個很明顯吧,h 和 a 都是char型別的字面常量,char型別不能相加,會自動轉換為int型別進行計算。如果需要...

java解惑之表示式之謎 謎題8

謎題8 dos equis 這個謎題將測試你對條件操作符 冒號問號操作符 的掌握程式,看下面的程式會列印出什麼結果?public class dosequis 只要對條件操作符了解的都知道第一條列印語句應該列印的是字元x,第二條列印語句也應該列印出字元x,即列印結果應當是xx。而執行後,實際列印出來...

SQL解惑 謎題8 排程印表機

解惑一 create table printercontrol user id start char 10 not null,user id finish char 10 not null,printer name char 4 not null,printer description char 4...