精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

国内精品国语自产拍在线观看| 亚洲欧美在线x视频| 色就是色欧美| 中文字幕福利视频| 99久久影视| 日韩一二三区不卡| 日本丰满少妇xxxx| 日韩一级片免费在线观看| 日韩天堂av| 亚洲网址你懂得| 色网站在线视频| 妞干网免费在线视频| 久久九九久久九九| 国产精品欧美日韩| 久久久精品成人| 精品一级视频| 色中色一区二区| 在线播放豆国产99亚洲| 亚洲精品免费在线观看视频| 亚洲一区国产| 日韩一中文字幕| 男人的天堂影院| 一区二区乱码| 亚洲精选在线视频| 欧美一级爱爱| 99热这里只有精品99| 亚洲精品一二三区区别| 亚洲精品国产精品国产自| 91精品无人成人www| 波多野结衣在线观看| 国产无遮挡一区二区三区毛片日本| 91日本在线观看| 特级毛片www| 亚洲精品tv久久久久久久久久| 亚洲精品一区二区三区不| 色偷偷中文字幕| 日本欧美一区| 天天综合天天综合色| 一区二区三区四区视频在线观看| 人妻中文字幕一区| 蜜臀久久久久久久| 91福利视频网| 欧美成人三级视频| 第一社区sis001原创亚洲| 日韩一区二区影院| 妺妺窝人体色www在线观看| 人交獸av完整版在线观看| 国产精品第13页| 热舞福利精品大尺度视频| 国产伦理吴梦梦伦理| 先锋影音久久久| 久久久久久中文字幕| 欧美一区二区三区爽爽爽| 成人看的视频| 亚洲一级免费视频| 韩国三级hd两男一女| 动漫一区二区三区| 精品视频123区在线观看| 波多野结衣家庭教师在线播放| 成人在线免费看片| 国产清纯在线一区二区www| 国产精品毛片一区视频| 亚洲黄色一级大片| 国产成人免费在线观看| 91高跟黑色丝袜呻吟在线观看| 亚洲一区二区天堂| 久久激五月天综合精品| 国产精品网址在线| 中文字幕乱码在线观看| 美女久久久精品| 国产精品久久久久久久久| 国产高潮久久久| 欧美99在线视频观看| 久久九九国产精品怡红院| 亚洲av无码国产精品麻豆天美| 色先锋久久影院av| 亚洲欧美在线磁力| 性猛交娇小69hd| 成人在线一区| 久久久精品免费视频| 日韩乱码人妻无码中文字幕久久| 韩日一区二区三区| 国产香蕉精品视频一区二区三区| 亚洲中文字幕一区| 九九亚洲精品| 神马国产精品影院av| 国产毛片欧美毛片久久久| 精品国产成人| 久久九九免费视频| 午夜精品久久久久99蜜桃最新版 | 亚洲精品无码久久久久| 美女精品在线| 国产精品老女人视频| 中日韩av在线| 国产一区在线精品| 国产精品一区二区在线观看| 婷婷五月综合激情| 2023国产一二三区日本精品2022| 日本一区二区在线| 久操免费在线| 一区二区三区免费观看| 日韩a∨精品日韩在线观看| 欧美成人ⅴideosxxxxx| 欧美精品日韩一本| 免费人成视频在线播放| 黄色免费大全亚洲| 在线播放国产精品| 久一区二区三区| 日精品一区二区三区| 国产精品伦子伦免费视频| 国产精品久久久久久久免费 | 国产精品一区二区av交换| 中文字幕亚洲图片| 精品无码人妻一区二区三| 久久福利一区| 4444kk亚洲人成电影在线| 五十路在线观看| 国产精品乱码一区二区三区软件 | 精品成人一区| 国产精品亚发布| 国产农村妇女毛片精品久久| 2019国产精品| 蜜臀av性久久久久蜜臀av| 欧美大片免费观看网址| 91精品国产麻豆国产自产在线 | 国产精品麻豆入口| 色一区二区三区四区| 69久久夜色精品国产7777| 91精品国自产| 国产日产欧美精品一区二区三区| 91免费国产精品| 成人精品国产亚洲| 欧美一区二区三区系列电影| 日韩Av无码精品| 久久国产电影| 国产精品高潮呻吟视频 | 69堂国产成人免费视频| 亚洲自拍偷拍一区二区| 一区二区三区毛片免费| 国产精品黄页免费高清在线观看| 国产又粗又黄又爽的视频| 91热门视频在线观看| 国产一区二区四区| 97品白浆高清久久久久久| 日韩网站免费观看| 日韩字幕在线观看| 国产宾馆实践打屁股91| 色一情一乱一伦一区二区三区| 日本理论片午伦夜理片在线观看| 亚洲成a人片综合在线| 青娱乐精品在线| 91精品国产成人观看| 国产精品久久久久久婷婷天堂| 黄色aaa毛片| 亚洲午夜一区二区| 国产在线观看中文字幕| 国产精品99视频| 国产精品99久久99久久久二8| 污污视频在线免费看| 中文字幕av一区二区三区免费看| 亚洲精品一二三四五区| 成人av综合网| 亚欧美中日韩视频| 狠狠综合久久av一区二区小说| 青青青在线视频免费观看| 99re91这里只有精品| 欧美成人午夜免费视在线看片 | 欧美日韩激情一区二区| 国产毛片久久久久久久| 99精品久久| 久久久久久国产精品一区| 黄页在线观看免费| 欧美精品一区男女天堂| 日本少妇做爰全过程毛片| 成人白浆超碰人人人人| 僵尸世界大战2 在线播放| 国产美女撒尿一区二区| 欧美精品18videosex性欧美| 刘亦菲久久免费一区二区| 亚洲va欧美va人人爽| 亚洲国产综合视频| 夜夜嗨网站十八久久| 久久综合狠狠综合久久综青草| 亚洲wwww| 亚洲新中文字幕| 国产男女猛烈无遮挡| 亚洲成人av资源| 中字幕一区二区三区乱码 | 熟妇女人妻丰满少妇中文字幕| 国产精品红桃| 欧美裸体网站| 粉嫩91精品久久久久久久99蜜桃| 久久成人精品电影| 黄色片一区二区三区| 欧美香蕉大胸在线视频观看| 少妇愉情理伦三级| 国产精品中文有码| 韩国无码av片在线观看网站| 伊人春色精品| 91网在线免费观看| 黄视频网站在线观看| 国产亚洲一区二区在线| www.久久成人| 在线亚洲一区二区| 日本黄色小说视频| 波多野结衣中文字幕一区二区三区 | 精品国产123区| 亚洲一区二区三区毛片| 筱崎爱全乳无删减在线观看| 亚洲欧美国内爽妇网| 国产精品玖玖玖| 婷婷久久综合九色综合绿巨人| 成人黄色免费网址| 成人美女在线视频| 国产免费又粗又猛又爽| 亚洲国产免费看| 特级毛片在线免费观看| 日韩超碰人人爽人人做人人添| 国产日韩精品在线播放| 涩涩视频在线| 色av中文字幕一区| 四虎精品在线| 欧美tk—视频vk| 亚洲一级特黄毛片| 欧美日韩精品国产| 美国美女黄色片| 国产成人av自拍| gogogo高清免费观看在线视频| 国产日韩1区| 喜爱夜蒲2在线| 久久精品国产www456c0m| 国产精品免费视频一区二区| 精品三级在线| 国产精品白嫩美女在线观看| 136福利第一导航国产在线| 久久精品美女视频网站| porn视频在线观看| 亚洲免费福利视频| 手机看片1024国产| 欧美tickling网站挠脚心| 国产欧美久久久| 欧美三区在线观看| 天天干天天插天天射| 亚洲成人自拍网| 久草视频中文在线| 一区二区日韩av| 日韩av片在线免费观看| 国产欧美中文在线| 在线免费观看成年人视频| 99久久综合99久久综合网站| 在线观看一区二区三区四区| 日产欧产美韩系列久久99| 久久久噜噜噜www成人网| 99精品国产99久久久久久福利| 日本aa在线观看| 午夜日韩视频| 亚洲乱码日产精品bd在线观看| 99精品在线| 国产手机视频在线观看| 亚洲国产精品久久久久蝴蝶传媒| 在线一区日本视频| 久久婷婷蜜乳一本欲蜜臀| 亚洲图色在线| 婷婷亚洲最大| 免费看黄色a级片| 影音先锋日韩资源| 日韩精品 欧美| 美女诱惑一区| 亚洲天堂网一区| 黄一区二区三区| 麻豆av免费看| 97久久人人超碰| 亚洲精品国产熟女久久久| 国产欧美一区二区精品性| 美国黄色特级片| 亚洲精选在线视频| 国产主播在线播放| 懂色aⅴ精品一区二区三区蜜月 | 亚洲妇女屁股眼交7| 久久久久人妻一区精品色欧美| 亚洲一区免费观看| 国内免费精品视频| 欧美日韩国产丝袜另类| 一级特黄免费视频| 欧美精品在欧美一区二区少妇| 在线播放精品视频| 日韩三级免费观看| www.五月激情| 亚洲女同精品视频| 欧美激情二区| 97视频色精品| 久久天天久久| 国产伦精品一区二区三区视频孕妇| 66精品视频在线观看| 麻豆成人小视频| 欧美xxav| 亚洲熟妇国产熟妇肥婆| 日本不卡视频一二三区| 人妻av一区二区三区| 久久久亚洲高清| 五月天av网站| 欧美性黄网官网| 国产一区二区三区中文字幕| 亚洲国产美女久久久久| 天天综合视频在线观看| 欧美精品久久久久久久久久| 一区二区三区电影大全| 91亚洲一区精品| 要久久电视剧全集免费| 日本老太婆做爰视频| 美女精品在线观看| 精品亚洲视频在线| 99在线视频精品| 三级av在线免费观看| 色94色欧美sute亚洲13| 精品国产伦一区二区三| 亚洲美女精品久久| 9999精品成人免费毛片在线看| 国产日韩欧美在线视频观看| 久久99国内| 你懂的av在线| av亚洲产国偷v产偷v自拍| 欧美精品一区二区成人| 884aa四虎影成人精品一区| 国产乱视频在线观看| 欧美诱惑福利视频| 麻豆一区二区麻豆免费观看| 91黄色在线看| 国产.精品.日韩.另类.中文.在线.播放 | 欧美爱爱视频免费看| 国产成人精品www牛牛影视| 天海翼在线视频| 欧美日韩三级一区二区| 高h视频在线| 国产精品精品视频一区二区三区| 亚欧日韩另类中文欧美| 97超碰在线人人| 成人激情小说乱人伦| 国产稀缺真实呦乱在线| 精品美女被调教视频大全网站| caopen在线视频| 亚洲综合日韩在线| 午夜精品久久99蜜桃的功能介绍| 亚洲理论中文字幕| 中文字幕亚洲欧美在线不卡| 国产精品久久久久久久一区二区 | 欧美三区四区| 日韩欧美亚洲区| 美日韩一级片在线观看| 国产免费嫩草影院| 在线综合+亚洲+欧美中文字幕| 国产区在线看| 97视频资源在线观看| 亚洲一级电影| 巨胸大乳www视频免费观看| 91久久精品国产91性色tv| 一级毛片视频在线| 亚洲一区二区少妇| 亚洲东热激情| 西西444www无码大胆| 欧美伊人久久久久久久久影院| 日本暖暖在线视频| 3d动漫精品啪啪一区二区三区免费 | 日本一区二区免费在线观看视频 | 亚洲美腿欧美激情另类| 日韩av免费| 成年人视频大全| 91网址在线看| 中文字幕一区二区在线视频| 久久色在线播放| 国产精品极品在线观看| 欧美黄网站在线观看| 中文子幕无线码一区tr| a在线观看免费| 97香蕉超级碰碰久久免费软件 | 中文欧美在线视频| 91精品国产一区二区在线观看 | 亚洲一区二区三区精品视频| 国产乱码精品一区二区三区五月婷 | 成人一区不卡| 波多野结衣办公室双飞 | 午夜精品久久久久久久99黑人 | 99这里只有精品| 正在播放木下凛凛xv99| 美女啪啪无遮挡免费久久网站| 九九热hot精品视频在线播放| 一级特黄性色生活片| 亚洲六月丁香色婷婷综合久久| 性xxxfllreexxx少妇| 国产欧美一区二区三区久久人妖 | 亚洲天堂2016| 四虎影视在线播放| 91在线看www| 另类国产ts人妖高潮视频| 青青草原在线免费观看| 一区二区三区视频免费| 91成人在线精品视频| 乌克兰美女av| 色综合视频在线观看| a级网站在线播放|