javathrows
『壹』 JAVA方法聲明處的throws關鍵字,是說明這個方法可能有異常拋出吧可能。那為什麼有些方法一定要throws呢
我不清楚是否正確理解了樓主想了解的問題,但我盡可能簡略而全面的談一談Java語言的異常處理。
首先,Java中在一個方法內通常有兩種形式的異常處理方法。
1. 在當前方法內使用try..catch..finally的語法結構捕獲並處理異常
2. 在方法體前,接著方法定義後通過throws關鍵字,申明拋出異常
Q 為什麼有這兩種形式呢,或者說為什麼需要處理異常?
A 即使使用的是Java或者C#等其他「高級語言」,異常的處理也在所難免。舉幾個例子,我們需要讀取一個文本文件,正常情況下,的確不會有任何問題。但如果發生意外,比如我們想要讀取的那個文件並不存在,或者還沒有生成,又或者被改名了,刪除了,怎麼辦呢?這些問題就編程語言本身而言(即使使用File.exists()或者isDir&isFile等判斷,也是人力所為),他們是並不知道的。當程序運行到某一行,試圖去讀取一個並不存在文件的時候,異常便發生了(注意,這里說的異常通常是指Exception的普通子類,而非運行時錯誤或者Error),而在我們這個例子里,就會引發FileNotFoundException,又比如,如果要操作一個網路位置上的遠程文件,則還有可能引發IO異常、或者網路異常等;在比如試圖訪問一個數組中並不存在的數據時,則會引發ArrayIndexOutOfBounds的越界異常。每當這些時候,Java的編譯器和語義規則就會強制要求我們捕獲並且處理它們。簡單的說,程序就像小孩子,如果不這樣做的話,他就不知道該怎樣運行下去了(這里我用的只是一個比喻,事實上世界還存在解釋型的腳本編程語言和函數式語言等,通常他們的編譯器並不一定強制要求你處理所有的異常,而是在運行時碰到具體錯誤才告訴你)。當時,需要注意的是,養成良好的異常處理習慣,仍是一個優秀程序員的習慣。
Q 什麼時候我需要在當前方法里catch然後處理,什麼時候我需要throw出去?
A 舉個例子,有時候,某個可能異常可能並不重要,我不想對他進行catch之後的大段處理、或者基於遠程的網路操作,我們只能記錄日誌,我可能就會想通過自定義一個自己的Exception子類,通過在內部方法內直拋出相關異常,最後在某個具體的handler或業務邏輯層(package)在統一捕獲和記錄處理。總之,何時處理、何時拋出屬於項目架構和基於工程角度需要思考的問題。總而言之,具體問題,具體分析。
『貳』 瑙f瀽Java-throw鎶涘嚭寮傚父璇︾粏榪囩▼
娣卞叆鎺㈢┒Java涓鐨則hrow鎶涘嚭寮傚父鏈哄埗
鍦↗ava緙栫▼涓錛屽紓甯稿勭悊鏄紜淇濈▼搴忕ǔ鍋ユх殑閲嶈佺幆鑺傘侸ava鎻愪緵浜嗕笁縐嶆姏鍑哄紓甯哥殑鏂瑰紡錛歵hrow銆乼hrows鍜岀郴緇熻嚜鍔ㄦ姏鍑哄紓甯革紝姣忕嶉兘鏈夊叾鐙鐗圭殑鐢ㄦ硶鍜岀洰鐨勩
1. throw
褰撲綘闇瑕佸湪浠g爜鎵ц岃繃紼嬩腑涓誨姩鎶涘嚭涓涓寮傚父鏃訛紝浣跨敤throw鍏抽敭瀛椼備緥濡傦紝鍦ㄦ柟娉曞唴閮錛屽綋閬囧埌鐗瑰畾鏉′歡鏃訛紝鍙浠ヨ繖鏍峰啓錛歵ry{鈥}catch(Exception e){throw new ArithmeticException("XXX");}finally{鈥} 榪欓噷錛宼hrow鍚庨潰璺熺潃鐨勬槸涓涓寮傚父瀵硅薄瀹炰緥錛岀『淇濈▼搴忔寜鐓ч勬湡榪涜屽紓甯稿勭悊銆
2. throws
鍙︿竴鏂歸潰錛宼hrows鐢ㄤ簬澹版槑鏂規硶鍙鑳芥姏鍑虹殑寮傚父銆傚湪鏂規硶絳懼悕涓錛屽俻ublic int division(int x, int y) throws ArithmeticException {鈥}錛岃繖縐嶆柟寮忚〃紺烘柟娉曞湪鎵ц屾椂鍙鑳戒細鎶涘嚭鐗瑰畾綾誨瀷鐨勫紓甯革紝浣嗗苟涓嶅己鍒跺湪鏂規硶鍐呴儴鎹曡幏錛岃屾槸鐣欑粰璋冪敤鑰呭勭悊銆
3. 緋葷粺鑷鍔ㄦ姏鍑哄紓甯
褰撻亣鍒拌娉曢敊璇銆佽繍琛屾椂閿欒鎴栫被鍨嬭漿鎹㈤敊璇鏃訛紝Java浼氳嚜鍔ㄦ姏鍑哄紓甯革紝濡備唬鐮佺ず渚嬩腑錛歩nt a = 5; int b = 0; int c = a/b; 榪欐椂錛岀▼搴忎細鎶涘嚭ArithmeticException錛屽洜涓洪櫎鏁頒負闆舵槸涓嶅厑璁哥殑銆
寮傚父鐨勫垎綾諱笌澶勭悊
寮傚父鍦↗ava涓琚鍒嗙被涓轟袱澶х被錛欵rror鍜孍xception銆侲rror浠h〃鐨勬槸鉶氭嫙鏈烘垨鐜澧冨眰闈㈢殑涓ラ噸閿欒錛岃孍xception鍒欏垎涓鴻繍琛屾椂寮傚父鍜屾鏌ュ紓甯搞傝繍琛屾椂寮傚父閫氬父鐢辯紪紼嬮敊璇寮曡搗錛屽侼ullPointerException錛岃屾鏌ュ紓甯稿垯闇瑕佸湪浠g爜涓鏄懼紡鎹曡幏澶勭悊錛屽侷OException銆
throw鐨勮︾粏榪囩▼
涓巘hrows涓嶅悓錛宼hrow璇鍙ョ洿鎺ユ姏鍑哄紓甯搞傚皾璇曚嬌鐢╰hrow鏃訛紝蹇呴』紜淇濇姏鍑虹殑鏄涓涓鏈夋晥鐨勫紓甯稿硅薄錛屽惁鍒欑紪璇戝櫒浼氭姤閿欍備嬌鐢╰hrow鏈変袱縐嶅父瑙佺瓥鐣ワ細涓誨姩鎶涘嚭鍜岃鍔ㄥ勭悊銆
涓誨姩鎶涘嚭
鍦ㄧ『瀹氱殑浠g爜浣嶇疆浣跨敤throw錛岃繖鏄涓縐嶄富鍔ㄥ勭悊寮傚父鐨勬柟寮忋備緥濡傦紝褰撶『瀹氭煇涓鏉′歡灝嗗艱嚧閿欒鏃訛紝鍙浠ュ啓鍏throw new SomeException("鐗瑰畾鍘熷洜")銆傝繖縐嶆柟寮忛傜敤浜庣綍瑙佷笖宸茬煡鐨勫紓甯告儏鍐點
琚鍔ㄥ勭悊
鍙︿竴縐嶆柟寮忔槸浣跨敤try-catch-finally緇撴瀯鏉ユ崟鑾峰紓甯搞傚湪try鍧椾腑鎵ц屽彲鑳戒細鎶涘嚭寮傚父鐨勪唬鐮侊紝濡傛灉鍙戠敓寮傚父錛宑atch浼氭崟鑾峰苟澶勭悊錛岃宖inally鍧楀垯鏃犺烘槸鍚﹀彂鐢熷紓甯擱兘浼氭墽琛屻
閫氳繃瀹炰緥婕旂ず錛屾垜浠鍙浠ョ湅鍒頒富鍔ㄦ姏鍑哄紓甯稿悗紼嬪簭浼氬繪壘涓庝箣鍖歸厤鐨刢atch鏉ュ勭悊錛岃屽傛灉娌℃湁鎵懼埌錛屽垯浼氶愬眰鍚戜笂鎶ュ憡緇欒皟鐢ㄨ呫傝繖縐嶆満鍒剁『淇濅簡寮傚父鐨勪紶鎾鍜屽勭悊錛屽炲己浜嗙▼搴忕殑鍋ュ.鎬с
『叄』 鍦↗ava涓錛宼hrow涓巘hrows鏈変粈涔堝尯鍒錛熶粬浠鍚勮嚜鐢ㄥ湪浠涔堝湴鏂癸紵
涓婇潰鐨勫凡緇忚В閲婂緢璇︾粏浜 鎴戝氨琛ュ厖涓ょ偣鍚 涓,throws鐢ㄥ湪鍑芥暟涓婏紝鍚庨潰璺熷紓甯哥被鍚嶏紝鐢ㄤ簬鏍囩ず鍑芥暟鐨勫紓甯革紝濡傛灉鏈夊氫釜寮傚父綾伙紝鐢ㄩ楀彿闅斿紑錛涗簩錛宼hrow 鐢ㄥ湪鍑芥暟鍐咃紝鍚庨潰璺熻窡寮傚父瀵硅薄錛岄氬父鎯呭喌鏄榪欐牱鐨勶細鍑芥暟鐢╰hrow鎶涘嚭寮傚父瀵硅薄錛屽嚱鏁頒笂蹇呴』鐢╰hrows鏍囩ず