精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊Java 異常處理基礎(chǔ)篇

開發(fā) 后端
計算機程序運行會有個主入口,一般我們稱為 main 方法,main 方法內(nèi)部也可能調(diào)用各種其它方法。當某個方法發(fā)生錯誤時,這個方法就會創(chuàng)建一個對象,并把它移交給運行時的系統(tǒng)。這個對象就稱為異常對象,它包含了錯誤相關(guān)的信息,包括錯誤類型和程序狀態(tài)。

[[410072]]

本文轉(zhuǎn)載自微信公眾號「蝸牛互聯(lián)網(wǎng)」,作者白色蝸牛。轉(zhuǎn)載本文請聯(lián)系蝸牛互聯(lián)網(wǎng)公眾號。

閱讀本文你將收獲:

什么是異常

我們?nèi)粘I钪薪?jīng)常會遇到一些意外的事情,比如坐火車沒帶身份證,那你就無法順利上車。

計算機世界也有類似的情形,術(shù)語是異常(Exception),其實是異常事件(Exception Event)的縮寫。

一個異常就是一個事件,它發(fā)生在程序執(zhí)行過程中,會中斷程序的正常運行。好比你上火車沒有身份證,這就是個異常事件,這個事件會阻擋你正常上火車。

計算機程序運行會有個主入口,一般我們稱為 main 方法,main 方法內(nèi)部也可能調(diào)用各種其它方法。當某個方法發(fā)生錯誤時,這個方法就會創(chuàng)建一個對象,并把它移交給運行時的系統(tǒng)。這個對象就稱為異常對象,它包含了錯誤相關(guān)的信息,包括錯誤類型和程序狀態(tài)。

創(chuàng)建異常對象并將其交給運行時系統(tǒng)這個操作就稱為拋出異常。

當方法拋出異常后,運行時系統(tǒng)會嘗試找到處理異常的方法。首先系統(tǒng)會判斷,錯誤發(fā)生的方法有沒有處理,如果沒有,會把異常往上層方法拋,直到找到有異常處理的方法。這樣的話,從錯誤發(fā)生的方法到異常處理的方法之間,就會形成調(diào)用方法的有序列表。

這個方法列表就稱為調(diào)用堆棧(call stack)。應(yīng)用程序的每個方法會按調(diào)用順序進棧,棧是先進后出的,比如 main 方法先進棧,開始執(zhí)行程序,遇到其他方法的調(diào)用,其他方法也進棧,其他方法執(zhí)行完畢,其他方法出棧,繼續(xù)執(zhí)行 main 方法,main 方法執(zhí)行完畢就出棧,棧空,程序運行結(jié)束。

運行時系統(tǒng)會在調(diào)用堆棧中尋找包含可以處理異常的代碼塊的方法,這段代碼就稱為異常處理程序。通過調(diào)用堆棧,從錯誤發(fā)生的方法開始,按照方法調(diào)用相反的順序?qū)ふ?棧有先進后出的特點)。當找到合適的異常處理程序時,運行時系統(tǒng)就會把異常傳遞給處理程序。如果拋出的異常對象的類型和處理程序可以處理的類型相匹配,就認為異常處理程序是適當?shù)摹?/p>

選中異常處理程序的過程就稱為捕獲異常。

如果運行時系統(tǒng)找遍了調(diào)用堆棧上的所有方法,依然沒有找到適當?shù)漠惓L幚沓绦颍敲催\行時系統(tǒng)(以及隨后的程序)將終止。

觀察以下代碼,想想運行情況是怎樣的?

  1. package com.springtest.demo; 
  2.  
  3. public class Test { 
  4.  
  5.     /** 
  6.      * 程序主方法 
  7.      * 
  8.      * @param args 程序入?yún)?nbsp;
  9.      */ 
  10.     public static void main(String[] args) { 
  11.  
  12.         // 用戶輸入字符串 woniu 
  13.         String woniu = "woniu"
  14.  
  15.         int num = str2number(woniu); 
  16.  
  17.         System.out.println(num); 
  18.     } 
  19.  
  20.     /** 
  21.      * str 轉(zhuǎn) 整數(shù) 
  22.      * 
  23.      * @param str 字符串 
  24.      * @return 整數(shù) 
  25.      */ 
  26.     private static int str2number(String str) { 
  27.  
  28.         // 解析成數(shù)字,拋 NumberFormatException 
  29.         return Integer.parseInt(str); 
  30.     } 
  31.  

輸出是這樣的:

  1. Exception in thread "main" java.lang.NumberFormatException: For input string: "woniu" 
  2.  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
  3.  at java.lang.Integer.parseInt(Integer.java:580) 
  4.  at java.lang.Integer.parseInt(Integer.java:615) 
  5.  at com.springtest.demo.Test.str2number(Test.java:29) 
  6.  at com.springtest.demo.Test.main(Test.java:15) 

觀察運行的結(jié)果信息,我們發(fā)現(xiàn)應(yīng)用主程序出現(xiàn)異常了,并且程序終止掉了,因為 num 的值并沒有打印。

結(jié)果里也告知我們是出現(xiàn)了 NumberFormatException,也就是數(shù)字格式異常,后邊也給到了提示,woniu 這個字符串是轉(zhuǎn)換不了數(shù)字的。這符合我們的預(yù)期。

然后就是調(diào)用堆棧,調(diào)用堆棧里的每一行信息都標明了異常流轉(zhuǎn)過程中所在的方法路徑,類名以及代碼行數(shù)。

其中第一行信息就是異常最先發(fā)生的地方,這也可以作為我們異常排查的依據(jù)。

很明顯,在 forInputString 拋出異常后,parseInt 和 str2number 都只是轉(zhuǎn)發(fā)異常,并沒有捕獲異常,甚至在 main 方法中,也沒捕獲異常。最后因為沒有異常處理程序,而導(dǎo)致程序運行終止。

如何捕獲和處理異常

為了程序能夠正常運行不被意外終止,Java 編程規(guī)范就有要求:異常必須要捕獲或者指定。

使用 try

捕獲異常的第一步是用 try 把可能引發(fā)異常的代碼括起來。

語法如下:

  1. try { 
  2.     // 可能引發(fā)異常的代碼 

try 包括了一個代碼塊,你可以把可能引發(fā)異常的代碼放里邊。代碼可以是一行,也可以是多行。這也意味著這個代碼塊可能引發(fā)多種不同的異常。

異常處理程序只有 try 是無法通過編譯的。你用 javac 命令編譯只有 try 的 java 文件,會報以下錯誤:

錯誤: 'try' 不帶有 'catch', 'finally' 或資源聲明

  1. 錯誤: 'try' 不帶有 'catch''finally' 或資源聲明 
  2.         try { 
  3.         ^ 
  4. 1 個錯誤 

所以 try 代碼塊只是圈定了捕獲異常的范圍,只靠 try 做異常管理顯然不夠。

使用 catch

catch 語法

因此捕獲異常就需要第二步:用 catch 捕獲異常和異常處理。

語法如下:

  1. try { 
  2.     // 可能引發(fā)異常的代碼 
  3. } catch (ExceptionType1 name1) { 
  4.     // 命中異常類型1 ExceptionType1 時的異常處理代碼 
  5. } catch (ExceptionType2 name2) { 
  6.     // 命中異常類型2 ExceptionType2 時的異常處理代碼 

catch 是搭配 try 使用的,不單獨出現(xiàn)。try 后邊可以跟多個 catch 代碼塊,以處理 try 中出現(xiàn)的多種類型的異常。

每個 catch 代碼塊都是一個異常處理程序,處理的時候由 catch 的參數(shù)指定異常類型。

catch 的圓括號里,參數(shù) ExceptionType 聲明了這個處理程序可以處理的異常類型,這個異常類型必須是從 Throwable 類繼承的類。

Java 異常的繼承體系

提到 Throwable 就不得不說 Java 的異常體系。以下是 Java 異常的繼承體系圖。

Throwable 是異常體系的根,它繼承自 Object。Throwable 又拆分成兩個體系:Error 和 Exception。

Error 表示嚴重的錯誤,程序一般無法處理,比如表示棧溢出的 StackOverflowError。

Exception 表示運行時的錯誤,它是可以被捕獲并處理的。Exception 又可以拆分為兩類:RuntimeException 和 Checked Exception。

RuntimeException 指運行時異常,它是程序邏輯編寫不對造成的,比如表示空指針異常的 NullPointerException 以及表示數(shù)組索引越界的 IndexOutOfBoundsException。出現(xiàn)這種異常就是代碼 Bug,應(yīng)該修復(fù)程序代碼。

  1. int[] arrry = {0,1,2}; 
  2.  
  3. // 此處會拋 java.lang.ArrayIndexOutOfBoundsException,不應(yīng)該出現(xiàn) arrry[3] 這樣的代碼 
  4. System.out.println(arrry[3]); 

Checked Exception 指檢測型異常,它是程序邏輯的一部分。比如表示 IO 異常的 IOException 以及表示文件找不到的 FileNotFoundException。這種異常必須捕獲并處理,否則編譯會失敗。

以下代碼是不能編譯通過的:

  1. public class A { 
  2.     public static void main(String[] args) { 
  3.  
  4.         FileInputStream inputStream = new FileInputStream("/"); 
  5.  
  6.     } 

javac 編譯會報以下錯誤,也會提示你必須用 try/catch 捕獲或者把異常添加到聲明里方便拋出。

  1. 錯誤: 未報告的異常錯誤FileNotFoundException; 必須對其進行捕獲或聲明以便拋出 
  2.         FileInputStream inputStream = new FileInputStream("/"); 
  3.                                       ^ 
  4. 1 個錯誤 

catch 使用

回到 catch 語法中,ExceptionType 對應(yīng)的就是 Java 異常體系中的 Exception 類或者它的子類。

name 是為異常類型起的名稱,花括號里的內(nèi)容就是調(diào)用異常處理程序時執(zhí)行的代碼,這里的代碼可以通過 name 這個名稱引用異常。

當調(diào)用堆棧出現(xiàn)異常時,運行時系統(tǒng)會調(diào)用異常處理程序,當異常處理程序的 ExceptionType 和引發(fā)異常的類型匹配時,即命中某個 catch 塊,就會把異常對象分配給異常處理程序的參數(shù),進而執(zhí)行 catch 塊的異常處理代碼。

異常處理程序我們可以做很多事情,比如打印錯誤日志,暫停程序,執(zhí)行錯誤恢復(fù),也可以提示給用戶,或者把異常往上層傳遞。以下是打印錯誤信息的示例代碼:

  1. public static void main(String[] args) { 
  2.  
  3.     try { 
  4.  
  5.         int[] arrry = {0, 1, 2}; 
  6.  
  7.         // 此處會拋 java.lang.ArrayIndexOutOfBoundsException,不應(yīng)該出現(xiàn) arrry[3] 這樣的代碼 
  8.         System.out.println(arrry[3]); 
  9.  
  10.     } catch (IndexOutOfBoundsException e) { 
  11.  
  12.         System.out.println("捕獲到數(shù)組越界異常:"); 
  13.         System.out.println(e); 
  14.     } 

輸出結(jié)果為:

  1. 捕獲到數(shù)組越界異常: 
  2. java.lang.ArrayIndexOutOfBoundsException: 3 

有些場景,我們的一段代碼可能引發(fā)多種異常,而異常的處理會比較一致,比如都是打印日志,這種情況下,如果都單獨設(shè)置一個 catch 塊,寫相同的代碼,重復(fù)度就很高。

因此在 Java 7 之后,一個 catch 塊就支持處理多種類型的異常。語法如下:

  1. try { 
  2.     // 可能引發(fā)異常的代碼 
  3. } catch (ExceptionType1 name1 | ExceptionType2 name2) { 
  4.     // 命中異常類型1 ExceptionType1 或異常類型2 ExceptionType2 時的異常處理代碼 
  5. }  

使用 finally

程序在運行的時候有時候會打開一些資源,比如文件,連接,線程等等。如果程序運行中途拋異常,程序終止,打開的資源就永遠得不到釋放了,這會導(dǎo)致資源泄漏,甚至系統(tǒng)崩潰。

再比如,程序運行結(jié)束前,我要輸出一個摘要日志做監(jiān)控,但如果運行中途拋異常,程序終止,日志就不會打印,我也看不到我想要的信息。

因此需要有種機制,能夠支持在異常發(fā)生,阻斷流程的時候,也能把打開的資源釋放掉或者執(zhí)行指定的邏輯。

Java 用 finally 來達成這種目的,finally 可以形成try-finally 結(jié)構(gòu),也可以形成 try-catch-finally 結(jié)構(gòu)。但是 finally 代碼塊總是在 try 退出時執(zhí)行。

這個「總是」可以分為以下幾種情況:

無異常

try 執(zhí)行完畢,未發(fā)生異常,然后執(zhí)行 finally 代碼塊,像普通程序一樣順序執(zhí)行。

  1. public static void main(String[] args) { 
  2.  
  3.     System.out.println("main:" + fetchMyName()); 
  4.  
  5.  
  6. public static String fetchMyName() { 
  7.  
  8.     String me = "woniu"
  9.  
  10.     try { 
  11.         me = "woniu666"
  12.  
  13.     } finally { 
  14.         System.out.println("finally: " + me); 
  15.     } 
  16.  
  17.     return me; 

輸出:

  1. finally: woniu666 
  2. main:woniu666 

有異常未捕獲

try 執(zhí)行過程中出現(xiàn)異常,會把異常對象拋出,但 finally 代碼塊依然會執(zhí)行。

  1. public static void main(String[] args) { 
  2.  
  3.     System.out.println("main:" + fetchMyName()); 
  4.  
  5.  
  6. public static String fetchMyName() { 
  7.  
  8.     String me = "woniu"
  9.     int[] arrry = {0, 1, 2}; 
  10.  
  11.     try { 
  12.         me = "woniu666"
  13.  
  14.         // 此處會拋 java.lang.ArrayIndexOutOfBoundsException,不應(yīng)該出現(xiàn) arrry[3] 這樣的代碼 
  15.         System.out.println(arrry[3]); 
  16.  
  17.     } finally { 
  18.         System.out.println("finally: " + me); 
  19.     } 
  20.  
  21.     return me; 

fetchMyName() 未捕獲到異常,就往上拋,但會把 finally 里的邏輯先執(zhí)行掉,在 main 方法中同樣沒有捕獲異常,于是就阻斷了程序,打印出了調(diào)用堆棧。

  1. finally: woniu666 
  2. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 
  3.  at com.springtest.demo.TryFinally.fetchMyName(TryFinally.java:28) 
  4.  at com.springtest.demo.TryFinally.main(TryFinally.java:15) 

有異常有捕獲

try 執(zhí)行過程中出現(xiàn)異常,會把異常對象拋出,catch 捕獲異常并正常處理,此時 finally 代碼塊依然會執(zhí)行。

  1. public static void main(String[] args) { 
  2.  
  3.     System.out.println("main:" + fetchMyName()); 
  4.  
  5.  
  6. public static String fetchMyName() { 
  7.  
  8.     String me = "woniu"
  9.     int[] arrry = {0, 1, 2}; 
  10.  
  11.     try { 
  12.         me = "woniu666"
  13.  
  14.         // 此處會拋 java.lang.ArrayIndexOutOfBoundsException,不應(yīng)該出現(xiàn) arrry[3] 這樣的代碼 
  15.         System.out.println(arrry[3]); 
  16.  
  17.     } catch (ArrayIndexOutOfBoundsException e) { 
  18.         System.out.println("命中數(shù)組索引越界異常的處理器,越界索引為:" + e.getMessage()); 
  19.  
  20.     } finally { 
  21.         System.out.println("finally: " + me); 
  22.     } 
  23.  
  24.     return me; 

代碼正常運行,先執(zhí)行了 catch 代碼塊中的邏輯,然后執(zhí)行了 finally 代碼塊,最后執(zhí)行 main 方法。

  1. 命中數(shù)組索引越界異常的處理器,越界索引為:3 
  2. finally: woniu666 
  3. main:woniu666 

try 中 return

return 意味著方法執(zhí)行結(jié)束,而 finally 是在 try 退出時執(zhí)行,那如果 try 代碼塊中帶 return,finally 代碼塊還會執(zhí)行到么?

try 代碼塊加個 return 試試!

  1. public static void main(String[] args) { 
  2.  
  3.     System.out.println("main:" + fetchMyName()); 
  4.  
  5.  
  6. public static String fetchMyName() { 
  7.  
  8.     String me = "woniu"
  9.     int[] arrry = {0, 1, 2}; 
  10.  
  11.     try { 
  12.         me = "woniu666"
  13.  
  14.         // 此處不拋異常 
  15.         System.out.println(arrry[0]); 
  16.  
  17.         return "try"
  18.  
  19.     } catch (ArrayIndexOutOfBoundsException e) { 
  20.         System.out.println("命中數(shù)組索引越界異常的處理器,越界索引為:" + e.getMessage()); 
  21.  
  22.     } finally { 
  23.         System.out.println("finally: " + me); 
  24.     } 
  25.  
  26.     return me; 

看結(jié)果依然會走到 finally 代碼塊的執(zhí)行!

  1. finally: woniu666 
  2. main:try 

catch 中 return

try 中 return 我們試了,那 catch 中 return,finally 的執(zhí)行是啥樣的呢?

  1. public static void main(String[] args) { 
  2.  
  3.     System.out.println("main:" + fetchMyName()); 
  4.  
  5.  
  6. public static String fetchMyName() { 
  7.  
  8.     String me = "woniu"
  9.     int[] arrry = {0, 1, 2}; 
  10.  
  11.     try { 
  12.         me = "woniu666"
  13.  
  14.         // 此處會拋 java.lang.ArrayIndexOutOfBoundsException,不應(yīng)該出現(xiàn) arrry[3] 這樣的代碼 
  15.         System.out.println(arrry[3]); 
  16.  
  17.     } catch (ArrayIndexOutOfBoundsException e) { 
  18.         System.out.println("命中數(shù)組索引越界異常的處理器,越界索引為:" + e.getMessage()); 
  19.  
  20.         return "catch"
  21.  
  22.     } finally { 
  23.         System.out.println("finally: " + me); 
  24.     } 
  25.  
  26.     return me; 

看結(jié)果依然會走到 finally 代碼塊的執(zhí)行!

  1. 命中數(shù)組索引越界異常的處理器,越界索引為:3 
  2. finally: woniu666 
  3. main:catch 

如何指定方法拋出的異常

異常捕獲的知識介紹完之后,你想象另外一種情況,就是當前方法拋出異常后,但是呢,當前方法不適合處理這個異常,而調(diào)用堆棧上層的方法更適合處理。那其實當前方法最好就不要捕獲異常,并能夠允許調(diào)用堆棧上層的方法處理它。

此時,如果拋出的異常是 檢查型異常,那你就必須在方法上指定它可以拋出這些異常。你需要在方法聲明中添加一個 throws 語句。throws 語句包含 throws 關(guān)鍵字,后面跟著由該方法一引發(fā)的所有異常,多個異常用逗號分隔。throws 語句放在方法名和參數(shù)列表之后,放在定義方法范圍的圓括號之前。

代碼示例如下:

  1. public static void test() throws FileNotFoundException { 
  2.  
  3.     FileInputStream inputStream = new FileInputStream("/"); 
  4.  

由上層 main 方法捕獲處理:

  1. public static void main(String[] args) { 
  2.  
  3.     try { 
  4.         test(); 
  5.  
  6.     } catch (FileNotFoundException e) { 
  7.  
  8.         System.out.println("文件找不到異常:" + e.getMessage()); 
  9.     } 
  10.  

可以正常輸出:

  1. 文件找不到異常:/ (Is a directory) 

前邊說檢查型異常必須要處理,是因為不處理會編譯不通過,要么捕獲和處理異常,要么指定方法拋出的異常,

那非檢查型異常,也就是運行時異常也有這種要求么?

非檢查型異常并不強制,你可以指定方法拋出的異常,也可以不指定,不指定的時候,異常對象會不停的沿著調(diào)用堆棧向上層拋,直到被捕獲處理或者程序終止。

小結(jié)

本文介紹了異常的概念,我們了解到了異常相關(guān)的術(shù)語,異常出現(xiàn)的背景以及異常的運行機制,接著我們按照 Java 編程規(guī)范分別介紹了異常如何捕獲以及異常如何指定,同時也介紹了 Java 異常的繼承體系。這些都是非常基礎(chǔ)的內(nèi)容,卻也非常重要,寫代碼的時候必須要考慮這方面,甚至你可以認為,面向異常編程非常考驗?zāi)愕木幋a功底。

 

責任編輯:武曉燕 來源: 蝸牛互聯(lián)網(wǎng)
相關(guān)推薦

2022-05-12 23:19:15

Redis內(nèi)存碎片處理

2022-07-19 08:01:08

Azure云環(huán)境安全

2017-12-26 14:56:44

虛擬化基礎(chǔ)知識

2022-08-08 08:25:21

Javajar 文件

2018-06-07 13:17:12

契約測試單元測試API測試

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2023-09-29 08:58:38

2020-12-11 11:11:44

原子類JavaCAS

2019-08-29 09:30:20

Java泛型構(gòu)造器

2021-01-01 09:01:05

前端組件化設(shè)計

2020-08-12 08:34:16

開發(fā)安全We

2022-10-08 11:33:56

邊緣計算云計算

2022-11-26 00:00:06

裝飾者模式Component

2020-06-28 09:30:37

Linux內(nèi)存操作系統(tǒng)

2022-03-08 16:10:38

Redis事務(wù)機制

2022-03-29 09:56:21

游戲版本運營

2020-09-08 06:54:29

Java Gradle語言

2019-12-17 10:06:18

CDMA高通4G
點贊
收藏

51CTO技術(shù)棧公眾號

www.日本xxxx| 久久精品一二三区| 四虎永久免费在线| 中文字幕一区图| 亚洲国产成人va在线观看天堂| 国产日韩欧美一区二区| 亚洲成熟少妇视频在线观看| 欧美手机视频| 欧美一区二区三区免费在线看 | 2020国产精品自拍| 国产精品久久久久久久久久99| 黄色裸体一级片| 亚洲性视频在线| 91久久精品一区二区二区| 在线观看欧美一区| 嫩草影院一区二区| 老汉av免费一区二区三区| 欧美日本亚洲视频| 鲁丝一区二区三区| 日韩视频一二区| 日韩欧美中文字幕在线观看| 国产福利片一区二区| 天天干天天爱天天操| 看国产成人h片视频| 久久久噜噜噜久久中文字免| 国产成人免费观看网站| 极品一区美女高清| 911精品产国品一二三产区| 欧美色图色综合| a级网站在线播放| 26uuu国产一区二区三区 | japansex久久高清精品| 色综合天天综合网天天看片| 50度灰在线观看| 国产精品四虎| 成人久久视频在线观看| 91精品国产综合久久久久久久久| 国产精品久久久免费视频| 99精品电影| 亚洲区一区二区| 成熟妇人a片免费看网站| 性欧美video另类hd尤物| 色综合久久中文综合久久牛| 男人添女荫道口喷水视频| 91网页在线观看| 久久久久久日产精品| 国产精品久久久一区二区三区| 又污又黄的网站| 亚洲欧美清纯在线制服| 欧美激情videoshd| 欧美日韩在线观看成人| 久久婷婷蜜乳一本欲蜜臀| 亚洲天堂第一页| 亚洲制服丝袜在线播放| 99香蕉久久| 日韩一本二本av| 亚洲18在线看污www麻豆| 亚洲mmav| 色老汉av一区二区三区| www黄色av| 亚洲一级少妇| 欧美性猛交xxxx乱大交| 日韩精品 欧美| heyzo在线欧美播放| 亚洲一区二区欧美激情| www插插插无码免费视频网站| 麻豆电影在线播放| 成人免费在线视频观看| 97超碰免费观看| 国产在线看片| 亚洲黄色小视频| 国产成人生活片| 日皮视频在线观看| 亚洲福利视频一区| 99视频在线免费播放| 午夜影院在线观看国产主播| 欧美视频一区二区三区…| 无码人妻h动漫| 日韩网站中文字幕| 欧美日韩精品一区二区在线播放| mm131亚洲精品| 国产日韩在线观看视频| 日韩欧美中文字幕制服| 免费观看污网站| 欧美交a欧美精品喷水| 日韩经典第一页| 国产黄片一区二区三区| 青青草成人影院| 波霸ol色综合久久| 国产性生活网站| 一区二区三区福利| 国产精品久久久999| 国产又粗又猛又黄又爽无遮挡 | 性感美女一区二区三区| 欧美精品密入口播放| 在线观看国产精品91| 久久久99999| 激情另类综合| 国产精品福利小视频| 国产乱淫片视频| 成人app下载| 亚洲精品国产精品久久| 污污网站在线观看| 一本色道综合亚洲| 欧美性受xxxx黒人xyx性爽| 国产精品久久久久av蜜臀| 亚洲欧美激情在线视频| 久久精品一区二区三区四区五区| 国产在线不卡| 国产精品91久久久久久| www.国产.com| 国产丝袜美腿一区二区三区| 亚洲国产日韩美| av成人福利| 欧美日韩aaaaa| 屁屁影院国产第一页| 久久中文字幕av| 91高清视频在线免费观看| 一区二区视频播放| 不卡区在线中文字幕| 亚洲高清视频一区| 午夜久久中文| 日韩一区二区三区电影 | 岛国av一区| 少妇av一区二区三区| 国产污污视频在线观看| 国产精品18久久久久久久久| 日韩精品在在线一区二区中文| 丝袜美女在线观看| 欧美日韩一区二区三区不卡| 国产成人精品无码片区在线| 香蕉综合视频| 国产精品igao视频| 四虎影院在线域名免费观看| 亚洲综合在线免费观看| 91亚洲免费视频| 国产精品亚洲二区| 97超碰蝌蚪网人人做人人爽| a天堂在线视频| 国产精品久久看| av免费在线播放网站| 国产精品极品| 欧美激情乱人伦| 国产女人高潮时对白| 中文在线免费一区三区高中清不卡 | 丰满少妇高潮久久三区| 久久99国产精品久久99| 日本高清不卡一区二区三| 欧美大胆a人体大胆做受| 日韩欧美www| 国产精品久久久精品四季影院| 人人爽香蕉精品| 欧美人与物videos另类| 深夜福利视频一区二区| 亚洲国产日韩欧美在线动漫| 日本亚洲色大成网站www久久| 国产精品自拍一区| 国产奶头好大揉着好爽视频| 欧美高清免费| 深夜福利一区二区| 亚洲综合精品国产一区二区三区 | 精品一区二区6| 青青青爽久久午夜综合久久午夜| 日本在线观看一区二区三区| 三级成人在线| 一本色道久久综合亚洲精品小说| 91丝袜一区二区三区| 久久久久久亚洲综合| 男女无套免费视频网站动漫| 成人在线免费视频观看| 国产精品亚洲美女av网站| 日韩大片在线永久免费观看网站| 欧美群妇大交群中文字幕| 91久久国产综合| 国产盗摄女厕一区二区三区| a级免费在线观看| 任你躁在线精品免费| 欧美一级高清免费| 蜜桃成人在线视频| 欧美久久一二区| 久久久久久久久毛片| 成人国产一区二区三区精品| 国产一二三在线视频| 另类ts人妖一区二区三区| 日本国产高清不卡| 免费a在线看| 精品国产麻豆免费人成网站| 日本在线播放视频| 亚洲国产精品成人综合色在线婷婷| 亚洲这里只有精品| 欧美国产三级| 欧美激情第一页在线观看| h1515四虎成人| 欧美另类xxx| 三级国产在线观看| 欧美日本国产视频| 国产污视频在线看| 国产日产精品1区| 亚洲欧美日本一区二区三区| 欧美二区视频| 日本不卡一二三区| 欧美一级片网址| 欧美亚洲成人免费| а√中文在线8| 日韩精品极品视频| 国产乱码精品一区二三区蜜臂| 亚洲国产美女搞黄色| 男人舔女人下部高潮全视频| 国产美女av一区二区三区| 国产精品后入内射日本在线观看| 色综合久久网| 久久精品国产精品青草色艺| 欧美成人福利| 91高潮在线观看| av观看在线| 国产亚洲精品久久| 蜜臀久久99精品久久久| 欧美狂野另类xxxxoooo| 久久人妻免费视频| 一区二区三区在线观看网站| 久久亚洲无码视频| 99免费精品视频| 国内国产精品天干天干| 天堂午夜影视日韩欧美一区二区| 大陆极品少妇内射aaaaaa| 国产精品入口久久| 国产欧美一区二区视频| av国产精品| 国产精品无av码在线观看| 欧美理论影院| 69精品小视频| 日本高清在线观看| www.日本久久久久com.| 在线视频二区| 国产一区二区日韩精品欧美精品| 亚洲日本香蕉视频| 精品久久久久久久久久久院品网 | 在线免费观看日本一区| 97免费在线观看视频| 亚洲一卡二卡三卡四卡无卡久久 | 香港成人在线视频| 黄色一级视频免费| 亚洲精品乱码久久久久| 欧美第一页在线观看| 国产精品久久久久三级| 国产在视频线精品视频| 欧美激情一区二区在线| 欧美18—19性高清hd4k| 久久精品一区二区三区不卡| 国产男女猛烈无遮挡a片漫画 | 精品91在线| 中文字幕日韩精品无码内射| 在线精品小视频| 在线观看一区二区三区三州| 加勒比久久综合| 麻豆精品传媒视频| 日韩电影不卡一区| 91理论片午午论夜理片久久| 日韩久久一区| 国产精品女人网站| 国外成人福利视频| 国产精品小说在线| 美女视频一区| 91精品啪在线观看麻豆免费 | 欧美午夜丰满在线18影院| 日本三级黄色大片| 黄色精品一区二区| 久草免费新视频| 亚洲一二三级电影| 国产精品1234区| 欧美日韩国内自拍| 欧美啪啪小视频| 日本韩国精品一区二区在线观看| 亚洲免费视频二区| 欧美日本一道本| 99久久久久久久| 精品久久久久久久久久久久久久久 | 韩国欧美国产1区| 亚洲精品乱码久久久久久动漫| 国产在线乱码一区二区三区| 美女露出粉嫩尿囗让男人桶| 成人精品gif动图一区| 青青草视频播放| 国产调教视频一区| 99自拍视频在线| 亚洲激情中文1区| 天堂网一区二区三区| 欧美性xxxx极品高清hd直播| 波多野结衣大片| 欧美亚洲丝袜传媒另类| 一本色道久久综合熟妇| 日韩一区二区三| 搡老岳熟女国产熟妇| 国产视频久久久久久久| av在线免费播放网站| 色婷婷成人综合| 国产网红女主播精品视频| 欧洲成人午夜免费大片| xxxxx.日韩| 亚洲自拍偷拍色片视频| 久久影院资源站| 亚洲一卡二卡三卡四卡无卡网站在线看 | 精品视频自拍| 日本不卡一区二区三区视频| 91麻豆精品国产91久久久平台| 欧美xxxx吸乳| 快she精品国产999| 五月激情五月婷婷| 处破女av一区二区| 国产精品视频在| 亚洲一区二区三区不卡国产欧美| 国产精品久免费的黄网站| 欧美一区二区三区性视频| 手机看片1024日韩| 伊人伊人伊人久久| 国产在线精彩视频| 国产欧美在线播放| 卡通动漫国产精品| 麻豆视频传媒入口| 久久久久99| 久久无码专区国产精品s| 国产精品女主播av| 全部毛片永久免费看| 在线不卡中文字幕| 成年人在线观看网站| 欧美激情一区二区三区久久久| 国产美女高潮在线| 国产v亚洲v天堂无码| 成人一区二区| 女人扒开屁股爽桶30分钟| 国产乱人伦偷精品视频不卡| 成人黄色免费网址| 欧美性猛交xxxxx水多| 粉嫩小泬无遮挡久久久久久| 中文字幕免费精品一区| 美女福利一区二区| 国产午夜精品一区| 亚洲乱码电影| 国产aⅴ爽av久久久久| 26uuu精品一区二区三区四区在线| 国产精品久久久久久久精| 欧美精品丝袜久久久中文字幕| 欧美视频综合| 97视频免费在线看| 精品无人区一区二区| 久久99国产精品一区| 久久精品国产久精国产爱| 一区二区精品免费| 天天影视色香欲综合网老头| 日韩一级中文字幕| 欧美日韩福利视频| 亚洲伦理一区二区| 中文字幕日韩一区二区三区| 日韩电影免费一区| 一区二区三区四区免费| 日韩欧美主播在线| 色就是色亚洲色图| 久久久综合av| 中文字幕视频精品一区二区三区| 亚洲欧洲久久| 精品一区二区三区在线观看| 国产精品酒店视频| 欧美日韩一区二区在线观看| 成人p站proumb入口| 国产999精品久久久| 国产精品高潮呻吟久久久久| 黄色一级片播放| 波多野结衣91| 中文字幕黄色片| 亚洲精品中文字幕av| 精品极品在线| 久久青青草原| 国产欧美丝祙| 欧美熟妇激情一区二区三区| 在线看不卡av| 国产区在线观看| 91在线看网站| 亚洲二区视频| 中国毛片在线观看| 欧美日韩中文另类| 超碰在线无需免费| 国产精品国产三级国产专区53 | 国产一区二区三区直播精品电影 | 欧美成人三级在线播放| 国产精品久久一卡二卡| a级片在线播放| 欧美亚洲一区在线| 国模精品一区| 日韩a一级欧美一级| 亚洲国产日韩综合久久精品| 天堂中文在线资源| 国产精品免费久久久久久| 亚欧美无遮挡hd高清在线视频 | 欧美日韩亚洲综合一区二区三区激情在线| 亚洲精品一级| 免费在线观看你懂的| 欧美日韩美女一区二区| 超碰在线中文字幕| 奇米精品在线| 成人免费高清在线|