Java追求的是無故障,健壯的代碼,因此對一些可預知和不可預知的錯誤(如設備錯誤,演算法缺陷等)要進行處理,有兩種方法:
一種是捕獲: 一種是拋出 .
你可以嘗試自己寫一個父類,方法中有拋出異常,然後繼承這個方法的子類,就必須要捕獲,或者也throws 一個異常。
java.io.Reader
是BufferedReader 的父類,它本身方法會拋出一個異常。所以它的子類繼承了這個方法也需要捕獲或者拋出一個異常。這個BufferedReader 繼承的父類的方法就必須要處理異常,是因為JDK裡面的java.io.Reader 方法有拋出異常的需要。
更多可以參看下面IBM網站鏈接的「Java 異常處理及其應用」
2. 異常非要捕獲嗎直接拋出不可以嗎
可以倒是可以, 不過如果這么無限的拋下去, 可能到最後會累積很多的異常, 導致你都無法發現實際問題到底是在哪裡出現的, 異常的捕捉可以體現出代碼的嚴謹性, 你邏輯的合理性.
所以我們正常工作當中的規范是: 哪裡有可能出現異常就在哪裡捕捉, 問題出現了在開發階段就解決它.
3. 網路請求異常或精靈不在線
如果您連接的網路是聯通寬頻,網路連接失敗,可能存在以下原因:
1、寬頻欠費或到期,需要及時繳費或續期。
2、網線松動,需將網線的兩端插緊。
3、設備長時間使用造成,可把光貓、路由器、電腦等上網設備斷電10-20秒,再接通電源重啟。
4、如上述方法不能恢復建議聯系當地客服熱線工作人員。
4. java中涉及IO操作時,為什麼需要捕獲異常
IO操作一般是與系統外的數據有交換,比如讀文件,讀網路數據等,這類操作往往會有很多意外發生,比如文件類型不對,沒有許可權,網路超時等等,這類意外事件如果不捕獲的話用戶不好查找問題原因。所以sun定義時需要捕獲的是因為如果不捕獲的話可能產生不可預測的問題.
5. 程序中凡是可能出現異常的地方必須進行捕獲或拋出對嗎
一、異常的種類
java異常可以分成兩大類:Exception和RuntimeException(雖然RuntimeException是從Exception繼承的)。exception異常代表「無法避免的異常」 如io異常 往往這類異常是由於外部原因造成的,程序本身無法保證他們不發生,所以這類異常必須捕獲。如果在函數內部無法處理這個異常必須再次拋出(在函數後面用throws語句),如果什麼都不做就出現編譯錯誤。
runtimexception是指「可以避免的異常」,如 null引用異常,這類異常都是由程序內部原因造成的,是可以避免的。對於這類異常可以忽略他們,但一旦發生程序就會異常終止。這類異常對debug非常有幫助,當然,如果需要也可以catch。
另外,有些地方即使不會有exception,但是從商業邏輯上是錯誤的、非預期的,也可以拋出user exception。例如,用戶輸入非法,bank account非法透支等等。
二、主要原則
處理意外的一個重要原則,就是要麼處理,要麼接著拋,決不能吃掉(You either handle it, or throw it. You don』t eat it.)這就是說,當你捕獲一個異常之後,必須決定是否立即處理這個異常,或者繼續拋出這個異常(或者另一個自定義異常),以便由調用的客戶端捕獲之。當客戶端捕獲到以後,又會繼續進行類似的判斷。
一般來說,GUI端是要處理異常的,比如JSP捕獲到異常之後,需要先是給用戶一個友好的出錯信息,而不要給出系統的出錯信息。系統的出錯信息一方面不太友好,另一方面提供了太多的系統信息,容易被惡意用戶用來攻擊系統。
換句話說,所有的異常最終必須有一個終極的處理者,這就是GUI。至於中間的環節,比如在伺服器端運行的JavaBean是否要處理捕獲到的異常,還是繼續拋出所捕獲的異常,需要視具體情況處理。
除非你想把異常處理的責任交給調用者,一般不用throws。比如你要讀入一些文件,如果你想通知調用者,讓調用者決定如何處理這個異常,你就把這個異常throws給調用者;如果你知道應該如何處理這個異常,或者你想把異常馬上解決,你可以就地catch她。
這完全取決於你想把異常自己立即處理還是想把處理責任返回給調用者。取決於你的程序的結構和要求。
需要注意的有:
1、如果無法處理某個異常,那就不要捕獲它。
2、如果捕獲了一個異常,請不要胡亂處理它。
3、盡量在靠近異常被拋出的地方捕獲異常。
4、在捕獲異常的地方將它記錄到日誌中,除非您打算將它重新拋出。
5、按照您的異常處理必須多精細來構造您的方法。
6、需要用幾種類型的異常就用幾種,尤其是對於應用程序異常。
三、異常嵌套和捕獲適當的異常
按照Java語言的定義,所謂異常(Exception)指的就是向調用方法(calling method)表示發生非正常情況的習慣方式。下面討論兩種在處理異常時可茲利用的技術:異常嵌套和捕獲適當的異常。
異常嵌套
你在試圖捕獲異常並打算扔出異常時該採取什麼措施呢?同時,你希望原始的異常信息可用嗎?
要回答以上的問題你不妨嘗試一下NestedException類。具體的編程並不難,唯一要做的無非是利用構造器並且重載printStackTrace()以便顯示出正確的數據。
此外,你還應當考慮封裝Throwable而非Exception類來創建更具有重用性的組件。之後,你可以創建NestedRuntimeException變數封裝Throwable但無需對其進行聲明。
捕獲適當的異常
正確地處理異常並不是一項輕松的任務,這是因為異常的處理有時會導致程序出現其他不明行為。不過,以下三條規則可以幫助你避免錯誤處理異常所可能遭遇的風險。
規則 #1: 總是捕獲扔出異常的類型而不要理睬異常的超類。為了遵守通常的代碼習慣,你可以採用Exception類的大寫字母作為變數名,如下所示:
catch(FileNotFoundException fnfe)
以及
catch(SQLException sqle)
規則 # 2: 決不讓catch塊留空。在很多情況下雖然確實編寫了try/catch塊但在代碼的catch部分卻什麼都沒有做。或者,如果採用了日誌API(Logging API),那麼請編寫代碼把異常寫到日誌中。
規則 # 3: 決不扔出Exception基類的實例。開發人員應當總是扔出自己創建的異常類。
扔出異常的API很難處理。在聲明方法扔出java.lang.Exception的情況下,所有的問題都會強加在API用戶的頭上,這樣他們就無法以一種專業的編程方式來處理異常。通過為扔出API聲明Exception類的子類這一舉措,API開發人員就可以減輕用戶的負擔。
以上提到的兩種技術在處理異常時還可能用得更好、更適當。嵌套技術令異常扔到另一異常的內部,而捕獲適當的異常令程序調試大大簡化。
6. 系統檢測到網路中存在異常訪問請求 是什麼情況
如果是這種情況的話,網路首先保證是通暢的前提下,但是在訪問網路的過程中檢測到在整個網路中存在異常訪問請求,那麼就極有可能是有人在攻擊網路。你可以從網路上下載一個專業的網路管理軟體並安裝它,然後設置各種條件捕獲所需要的數據包進行詳細的分析,這樣肯定能夠找到問題根源所在。
7. 網路請求出錯什麼意思
一般來說是由於自己本身網路的問題造成網路請求失敗,但也存在伺服器出現問題,導致網路請求錯誤。
自身網路造成的網路請求錯誤非常常見,也非常容易解決。如果用戶當前的信號較差或者網速較差,這些都會出現網路請求錯誤的發生。建議用戶更換質量較好的網路,比如WiFi網路。或者去一些信號較好的地方解決該問題。
如果用戶的信號網速都沒有問題,但是依舊出現網路請求錯誤,可以看看用戶的移動數據有沒有打開,如果移動數據沒有打開也是會出現網路請求錯誤的。如果只是個別軟體出現網路請求錯誤,用戶可以在設置中看看有沒有禁止該軟體使用網路數據。禁用後的軟體也會出現網路請求錯誤。如果這個軟體沒有被禁用數據,但是依舊提示網路請求錯誤,這就表明該軟體的伺服器出現了問題,一般都是訪問量突然增大,造成伺服器崩潰顯示網路請求錯誤。
8. 網路抓包原理
本文以App作為例子,實際應用不限於App范圍。
大部分場合都可以通過程序調試來定位問題,但有些場景使用抓包來定位介面問題更准確、更方便,如以下場景:
要實現對App的網路數據抓包,需要監控App與伺服器交互之間的網路節點,監控其中任意一個網路節點(網卡),獲取所有經過網卡中的數據,對這些數據按照網路協議進行解析,這就是抓包的基本原理。
但是中間網路節點,不受我們控制,所以基本無法實現抓包的,只能在客戶端和服務端進行抓包。
通常我們監控本地網卡數據,如下圖:
本地網路 指的是WIFI的路由,如果直接抓路由器的包還是比較麻煩的,因此我們會在 手機 和 本地路由 之間加一層 代理服務 ,這樣只要抓代理服務的網路數據即可:
雖然在 手機 側也可實現抓包,但和 本地路由 一樣,抓包比較麻煩,如果不是沒有辦法,盡量還是不在手機側抓包。但是有一種情況必須在手機端抓包,那就是在4G網路情況下:
4G網路狀態下如何抓包,以及它的劣勢,我們後面章節再細講。
抓包實際上是分析網路協議的一種過程,盡管繁瑣的細節勞動都讓抓包工具做了,但我們還是需要了解下基礎的網路協議,好幫助我們更好的分析問題。
首先需要了解下經典的OSI七層網路模型,以及每層的作用,其次對TCP、HTTP協議簡單了解。
HTTPS是基於HTTP協議的一種改進,在 TCP之上 的會話層增加安全處理。對於應用層來說,HTTPS和HTTP沒有什麼不同,也就是說,HTTPS是保證網路傳輸的安全性,對業務數據無侵入。
簡化理解大概是這個樣子:
SSL和TLS是保證安全傳輸的協議,包括證書認證、加解密和數字簽名。
項目中HTTPS的鏈路:
因此,客戶端與後台,編寫網路介面時,不需要關心SSL或TLS,按照HTTP協議處理即可。
既然HTTPS在網路傳輸是經過加密的,那麼抓包抓到的數據就是密文,不經過解密是無法看到報文的。針對這個問題,如上圖WIFI環境下設置代理的方式可以解決,具體思路是:
所以整個網路鏈路依然是HTTPS在傳輸,但代理服務自己可以獲取到明文數據。
比較常用的抓包工具大概有4個,主要用作互補,配合使用基本所有平台、所有抓包需求都能滿足:
需要說明的是,tcpmp可將數據保存成文件,直接用wireShark打開分析,針對後台或手機抓包使用起來十分方便。
幾個工具間的使用關系:
為什麼要真機抓包?必定是沒有辦法設置代理服務了,如4G網路情況下直接和移動基站鏈接,沒法設置代理服務。凡是非4G網路狀態下,都不建議真機抓包。
iOS 5後,apple引入了RVI remote virtual interface的特性,它只需要將iOS設備使用USB數據線連接到mac上,然後使用rvictl工具以iOS設備的UDID為參數在Mac中建立一個虛擬網路介面rvi,就可以在mac設備上使用tcpmp,wireshark等工具對創建的介面進行抓包分析。
具體步驟:
android是linux系統,和後台一樣可以使用tcpmp命令來抓包,但是需要root許可權,因為一般手機系統不帶有抓包命令 tcpmp ,需要自行安裝。
安裝tcpmp:
使用tcpmp:
這是就已經進入抓包狀態,手機所有的網路請求都會被捕獲,並保存到capture文件中。
導出capture文件:
原文: 網路抓包