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

Try-Catch-Finally中的4個(gè)巨坑,老程序員也搞不定!

開發(fā) 前端
在 Java 語(yǔ)言中 try-catch-finally 看似簡(jiǎn)單,一副人畜無(wú)害的樣子,但想要真正的“掌控”它,卻并不是一件容易的事。

[[378885]]

本文轉(zhuǎn)載自微信公眾號(hào)「Java中文社群」,作者磊哥 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java中文社群公眾號(hào)。  

在 Java 語(yǔ)言中 try-catch-finally 看似簡(jiǎn)單,一副人畜無(wú)害的樣子,但想要真正的“掌控”它,卻并不是一件容易的事。別的不說(shuō),咱就拿 fianlly 來(lái)說(shuō)吧,別看它的功能單一,但使用起來(lái)卻“暗藏殺機(jī)”,若您不信,咱來(lái)看下面的這幾個(gè)例子...

坑1:finally中使用return

若在 finally 中使用 return,那么即使 try-catch 中有 return 操作,也不會(huì)立馬返回結(jié)果,而是再執(zhí)行完 finally 中的語(yǔ)句再返回。此時(shí)問(wèn)題就產(chǎn)生了:如果 finally 中存在 return 語(yǔ)句,則會(huì)直接返回 finally 中的結(jié)果,從而無(wú)情的丟棄了 try 中的返回值。

① 反例代碼

  1. public static void main(String[] args) throws FileNotFoundException { 
  2.     System.out.println("執(zhí)行結(jié)果:" + test()); 
  3.  
  4. private static int test() { 
  5.     int num = 0; 
  6.     try { 
  7.         // num=1,此處不返回 
  8.         num++; 
  9.         return num; 
  10.     } catch (Exception e) { 
  11.         // do something 
  12.     } finally { 
  13.         // num=2,返回此值 
  14.         num++; 
  15.         return num; 
  16.     } 

以上代碼的執(zhí)行結(jié)果如下:

② 原因分析

如果在 finally 中存在 return 語(yǔ)句,那么 try-catch 中的 return 值都會(huì)被覆蓋,如果程序員在寫代碼的時(shí)候沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題,那么就會(huì)導(dǎo)致程序的執(zhí)行結(jié)果出錯(cuò)。

③ 解決方案

如果 try-catch-finally 中存在 return 返回值的情況,一定要確保 return 語(yǔ)句只在方法的尾部出現(xiàn)一次。

④ 正例代碼

  1. public static void main(String[] args) throws FileNotFoundException { 
  2.     System.out.println("執(zhí)行結(jié)果:" + testAmend()); 
  3. private static int testAmend() { 
  4.     int num = 0; 
  5.     try { 
  6.         num = 1; 
  7.     } catch (Exception e) { 
  8.         // do something 
  9.     } finally { 
  10.         // do something 
  11.     } 
  12.     // 確保 return 語(yǔ)句只在此處出現(xiàn)一次 
  13.     return num; 

坑2:finally中的代碼“不執(zhí)行

”如果說(shuō)上面的示例比較簡(jiǎn)單,那么下面這個(gè)示例會(huì)給你不同的感受,直接來(lái)看代碼。

① 反例代碼

  1. public static void main(String[] args) throws FileNotFoundException { 
  2.     System.out.println("執(zhí)行結(jié)果:" + getValue()); 
  3. private static int getValue() { 
  4.     int num = 1; 
  5.     try { 
  6.         return num; 
  7.     } finally { 
  8.         num++; 
  9.     } 

以上代碼的執(zhí)行結(jié)果如下:

② 原因分析

本以為執(zhí)行的結(jié)果會(huì)是 2,但萬(wàn)萬(wàn)沒(méi)想到竟然是 1,用馬大師的話來(lái)講:「我大意了啊,沒(méi)有閃」。

有人可能會(huì)問(wèn):如果把代碼換成 ++num,那么結(jié)果會(huì)不會(huì)是 2 呢?

很抱歉的告訴你,并不會(huì),執(zhí)行的結(jié)果依然是 1。那為什么會(huì)這樣呢?想要真正的搞懂它,我們就得從這段代碼的字節(jié)碼說(shuō)起了。

以上代碼最終生成的字節(jié)碼如下:

  1. // class version 52.0 (52) 
  2. // access flags 0x21 
  3. public class com/example/basic/FinallyExample { 
  4.  
  5.   // compiled from: FinallyExample.java 
  6.  
  7.   // access flags 0x1 
  8.   public <init>()V 
  9.    L0 
  10.     LINENUMBER 5 L0 
  11.     ALOAD 0 
  12.     INVOKESPECIAL java/lang/Object.<init> ()V 
  13.     RETURN 
  14.    L1 
  15.     LOCALVARIABLE this Lcom/example/basic/FinallyExample; L0 L1 0 
  16.     MAXSTACK = 1 
  17.     MAXLOCALS = 1 
  18.  
  19.   // access flags 0x9 
  20.   public static main([Ljava/lang/String;)V throws java/io/FileNotFoundException  
  21.    L0 
  22.     LINENUMBER 13 L0 
  23.     GETSTATIC java/lang/System.out : Ljava/io/PrintStream; 
  24.     NEW java/lang/StringBuilder 
  25.     DUP 
  26.     INVOKESPECIAL java/lang/StringBuilder.<init> ()V 
  27.     LDC "\u6267\u884c\u7ed3\u679c:" 
  28.     INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
  29.     INVOKESTATIC com/example/basic/FinallyExample.getValue ()I 
  30.     INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder; 
  31.     INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String; 
  32.     INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V 
  33.    L1 
  34.     LINENUMBER 14 L1 
  35.     RETURN 
  36.    L2 
  37.     LOCALVARIABLE args [Ljava/lang/String; L0 L2 0 
  38.     MAXSTACK = 3 
  39.     MAXLOCALS = 1 
  40.  
  41.   // access flags 0xA 
  42.   private static getValue()I 
  43.     TRYCATCHBLOCK L0 L1 L2 null 
  44.    L3 
  45.     LINENUMBER 18 L3 
  46.     ICONST_1 
  47.     ISTORE 0 
  48.    L0 
  49.     LINENUMBER 20 L0 
  50.     ILOAD 0 
  51.     ISTORE 1 
  52.    L1 
  53.     LINENUMBER 22 L1 
  54.     IINC 0 1 
  55.    L4 
  56.     LINENUMBER 20 L4 
  57.     ILOAD 1 
  58.     IRETURN 
  59.    L2 
  60.     LINENUMBER 22 L2 
  61.    FRAME FULL [I] [java/lang/Throwable] 
  62.     ASTORE 2 
  63.     IINC 0 1 
  64.    L5 
  65.     LINENUMBER 23 L5 
  66.     ALOAD 2 
  67.     ATHROW 
  68.    L6 
  69.     LOCALVARIABLE num I L0 L6 0 
  70.     MAXSTACK = 1 
  71.     MAXLOCALS = 3 

這些字節(jié)碼的簡(jiǎn)易版本如下圖所示:

想要讀懂這些字節(jié)碼,首先要搞懂這些字節(jié)碼所代表的含義,這些內(nèi)容可以從 Oracle 的官網(wǎng)查詢到(英文文檔):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html

磊哥在這里對(duì)這些字節(jié)碼做一個(gè)簡(jiǎn)單的翻譯:

iconst 是將 int 類型的值壓入操作數(shù)棧。istore 是將 int 存儲(chǔ)到局部變量。iload 從局部變量加載 int 值。iinc 通過(guò)下標(biāo)遞增局部變量。ireturn 從操作數(shù)堆棧中返回 int 類型的值。astore 將引用存儲(chǔ)到局部變量中。

有了這些信息之后,我們來(lái)翻譯一下上面的字節(jié)碼內(nèi)容:

  1. 0 iconst_1   在操作數(shù)棧中存儲(chǔ)數(shù)值 1 
  2. 1 istore_0   將操作數(shù)棧中的數(shù)據(jù)存儲(chǔ)在局部變量的位置 0 
  3. 2 iload_0    從局部變量讀取值到操作數(shù)棧 
  4. 3 istore_1   將操作數(shù)棧中存儲(chǔ) 1 存儲(chǔ)在局部變量的位置 1 
  5. 4 iinc 0 by 1 把局部變量位置 0 的元素進(jìn)行遞增(+1)操作 
  6. 7 iload_1 將局部位置 1 的值加載到操作數(shù)棧中 
  7. 8 ireturn 返回操作數(shù)棧中的 int 值 

通過(guò)以上信息也許你并不能直觀的看出此方法的內(nèi)部執(zhí)行過(guò)程,沒(méi)關(guān)系磊哥給你準(zhǔn)備了方法執(zhí)行流程圖:

通過(guò)以上圖片我們可以看出:在 finally 語(yǔ)句(iinc 0, 1)執(zhí)行之前,本地變量表中存儲(chǔ)了兩個(gè)信息,位置 0 和位置 1 都存儲(chǔ)了一個(gè)值為 1 的 int 值。而在執(zhí)行 finally(iinc 0, 1)之前只把位置 0 的值進(jìn)行了累加,之后又將位置 1 的值(1)返回給了操作數(shù)棧,所以當(dāng)執(zhí)行返回操作(ireturn)時(shí)會(huì)從操作數(shù)棧中讀到返回值為 1 的結(jié)果,因此最終的執(zhí)行是 1 而不是 2。

③ 解決方案

關(guān)于 Java 虛擬機(jī)是如何編譯 finally 語(yǔ)句塊的問(wèn)題,有興趣的讀者可以參考《The JavaTM Virtual Machine Specification, Second Edition》中 7.13 節(jié) Compiling finally。那里詳細(xì)介紹了 Java 虛擬機(jī)是如何編譯 finally 語(yǔ)句塊。

實(shí)際上,Java 虛擬機(jī)會(huì)把 finally 語(yǔ)句塊作為 subroutine(對(duì)于這個(gè) subroutine 不知該如何翻譯為好,干脆就不翻譯了,免得產(chǎn)生歧義和誤解)直接插入到 try 語(yǔ)句塊或者 catch 語(yǔ)句塊的控制轉(zhuǎn)移語(yǔ)句之前。但是,還有另外一個(gè)不可忽視的因素,那就是在執(zhí)行 subroutine(也就是 finally 語(yǔ)句塊)之前,try 或者 catch 語(yǔ)句塊會(huì)保留其返回值到本地變量表(Local Variable Table)中,待 subroutine 執(zhí)行完畢之后,再恢復(fù)保留的返回值到操作數(shù)棧中,然后通過(guò) return 或者 throw 語(yǔ)句將其返回給該方法的調(diào)用者(invoker)。

因此如果在 try-catch-finally 中如果有 return 操作,**一定要確保 return 語(yǔ)句只在方法的尾部出現(xiàn)一次!**這樣就能保證 try-catch-finally 中所有操作代碼都會(huì)生效。

④ 正例代碼

  1. private static int getValueByAmend() { 
  2.     int num = 1; 
  3.     try { 
  4.         // do something 
  5.     } catch (Exception e) { 
  6.         // do something 
  7.     } finally { 
  8.         num++; 
  9.     } 
  10.     return num; 

坑3:finally中的代碼“非最后”執(zhí)行

① 反例代碼

public static void main(String[] args) throws FileNotFoundException { execErr();}private static void execErr() { try { throw new RuntimeException(); } catch (RuntimeException e) { e.printStackTrace(); } finally { System.out.println("執(zhí)行 finally."); }}

以上代碼的執(zhí)行結(jié)果如下:

從以上結(jié)果可以看出 finally 中的代碼并不是最后執(zhí)行的,而是在 catch 打印異常之前執(zhí)行的,這是為什么呢? 

② 原因分析

產(chǎn)生以上問(wèn)題的真實(shí)原因其實(shí)并不是因?yàn)?try-catch-finally,當(dāng)我們打開 e.printStackTrace 的源碼就能看出一些端倪了,源碼如下:

從上圖可以看出,當(dāng)執(zhí)行 e.printStackTrace() 和 finally 輸出信息時(shí),使用的并不是同一個(gè)對(duì)象。finally 使用的是標(biāo)準(zhǔn)輸出流:System.out,而 e.printStackTrace() 使用的卻是標(biāo)準(zhǔn)錯(cuò)誤輸出流:System.err.println,它們執(zhí)行的效果等同于:

  1. public static void main(String[] args) { 
  2.     System.out.println("我是標(biāo)準(zhǔn)輸出流"); 
  3.     System.err.println("我是標(biāo)準(zhǔn)錯(cuò)誤輸出流"); 

而以上代碼執(zhí)行結(jié)果的順序也是隨機(jī)的,而產(chǎn)生這一切的原因,我們或許可以通過(guò)標(biāo)準(zhǔn)錯(cuò)誤輸出流(System.err)的注釋和說(shuō)明文檔中看出:

我們簡(jiǎn)單的對(duì)以上的注釋做一個(gè)簡(jiǎn)單的翻譯:

“標(biāo)準(zhǔn)”錯(cuò)誤輸出流。該流已經(jīng)打開,并準(zhǔn)備接受輸出數(shù)據(jù)。通常,此流對(duì)應(yīng)于主機(jī)環(huán)境或用戶指定的顯示輸出或另一個(gè)輸出目標(biāo)。按照慣例,即使主要輸出流(out 輸出流)已重定向到文件或其他目標(biāo)位置,該輸出流(err 輸出流)也能用于顯示錯(cuò)誤消息或其他信息,這些信息應(yīng)引起用戶的立即注意。

從源碼的注釋信息可以看出,標(biāo)準(zhǔn)錯(cuò)誤輸出流(System.err)和標(biāo)準(zhǔn)輸出流(System.out)使用的是不同的流對(duì)象,即使標(biāo)準(zhǔn)輸出流并定位到其他的文件,也不會(huì)影響到標(biāo)準(zhǔn)錯(cuò)誤輸出流。那么我們就可以大膽的猜測(cè):二者是獨(dú)立執(zhí)行的,并且為了更高效的輸出流信息,二者在執(zhí)行時(shí)是并行執(zhí)行的,因此我們看到的結(jié)果是打印順序總是隨機(jī)的。

為了驗(yàn)證此觀點(diǎn),我們將標(biāo)準(zhǔn)輸出流重定向到某個(gè)文件,然后再來(lái)觀察 System.err 能不能正常打印,實(shí)現(xiàn)代碼如下:

  1. public static void main(String[] args) throws FileNotFoundException { 
  2.     // 將標(biāo)準(zhǔn)輸出流的信息定位到 log.txt 中 
  3.     System.setOut(new PrintStream(new FileOutputStream("log.txt"))); 
  4.     System.out.println("我是標(biāo)準(zhǔn)輸出流"); 
  5.     System.err.println("我是標(biāo)準(zhǔn)錯(cuò)誤輸出流"); 

以上代碼的執(zhí)行結(jié)果如下:

當(dāng)程序執(zhí)行完成之后,我們發(fā)現(xiàn)在項(xiàng)目的根目錄出現(xiàn)了一個(gè)新的 log.txt 文件,打開此文件看到如下結(jié)果:

從以上結(jié)果可以看出標(biāo)準(zhǔn)輸出流和標(biāo)準(zhǔn)錯(cuò)誤輸出流是彼此獨(dú)立執(zhí)行的,且 JVM 為了高效的執(zhí)行會(huì)讓二者并行運(yùn)行,所以最終我們看到的結(jié)果是 finally 在 catch 之前執(zhí)行了。

③ 解決方案

知道了原因,那么問(wèn)題就好處理,我們只需要將 try-catch-finally 中的輸出對(duì)象,改為統(tǒng)一的輸出流對(duì)象就可以解決此問(wèn)題了。

④ 正例代碼

  1. private static void execErr() { 
  2.     try { 
  3.         throw new RuntimeException(); 
  4.     } catch (RuntimeException e) { 
  5.         System.out.println(e); 
  6.     } finally { 
  7.         System.out.println("執(zhí)行 finally."); 
  8.     } 

改成了統(tǒng)一的輸出流對(duì)象之后,我手工執(zhí)行了 n 次,并沒(méi)有發(fā)現(xiàn)任何問(wèn)題。

坑4:finally中的代碼“不執(zhí)行”f

inally 中的代碼一定會(huì)執(zhí)行嗎?如果是之前我會(huì)毫不猶豫的說(shuō)“是的”,但在遭受了社會(huì)的毒打之后,我可能會(huì)這樣回答:正常情況下 finally 中的代碼一定會(huì)執(zhí)行的,但如果遇到特殊情況 finally 中的代碼就不一定會(huì)執(zhí)行了,比如下面這些情況:

  • 在 try-catch 語(yǔ)句中執(zhí)行了 System.exit;
  • 在 try-catch 語(yǔ)句中出現(xiàn)了死循環(huán);
  • 在 finally 執(zhí)行之前掉電或者 JVM 崩潰了。

如果發(fā)生了以上任意一種情況,finally 中的代碼就不會(huì)執(zhí)行了。雖然感覺(jué)這一條有點(diǎn)“抬杠”的嫌疑,但墨菲定律告訴我們,如果一件事有可能會(huì)發(fā)生,那么他就一定會(huì)發(fā)生。所以從嚴(yán)謹(jǐn)?shù)慕嵌葋?lái)說(shuō),這個(gè)觀點(diǎn)還是成立的,尤其是對(duì)于新手來(lái)說(shuō),神不知鬼不覺(jué)的寫出一個(gè)自己發(fā)現(xiàn)不了的死循環(huán)是一件很容易的事,不是嘛?

① 反例代碼

  1. public static void main(String[] args) { 
  2.     noFinally(); 
  3. private static void noFinally() { 
  4.     try { 
  5.         System.out.println("我是 try~"); 
  6.         System.exit(0); 
  7.     } catch (Exception e) { 
  8.         // do something 
  9.     } finally { 
  10.         System.out.println("我是 fially~"); 
  11.     } 

以上代碼的執(zhí)行結(jié)果如下:

 

從以上結(jié)果可以看出 finally 中的代碼并沒(méi)有執(zhí)行。

② 解決方案

排除掉代碼中的 System.exit 代碼,除非是業(yè)務(wù)需要,但也要注意如果在 try-cacth 中出現(xiàn)了 System.exit 的代碼,那么 finally 中的代碼將不會(huì)被執(zhí)行。

總結(jié)

本文我們展示了 finally 中存在的一些問(wèn)題,有很實(shí)用的干貨,也有一些看似“杠精”的示例,但這些都從側(cè)面印證了一件事,那就是想完全掌握的 try-catch-finally 并不是一件簡(jiǎn)單的事。最后,在強(qiáng)調(diào)一點(diǎn),如果 try-catch-finally 中存在 return 返回值的操作,那么一定要確保 return 語(yǔ)句只在方法的尾部出現(xiàn)一次!

參考 & 鳴謝

阿里巴巴《Java開發(fā)手冊(cè)》

developer.ibm.com/zh/articles/j-lo-finally

責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2021-03-31 11:52:24

try-catch-fJava代碼

2024-05-10 11:43:23

C#編程

2021-01-13 09:55:29

try-catch-fJava代碼

2019-10-21 08:16:17

邊緣計(jì)算數(shù)據(jù)安全網(wǎng)絡(luò)安全

2014-07-31 13:41:36

程序員

2015-11-12 10:23:26

老程序員編程策略

2015-08-27 08:43:07

程序員保值

2014-03-27 11:10:46

程序員老程序員

2023-01-06 07:37:08

JavaScript技巧t性能

2018-02-06 08:36:02

簡(jiǎn)歷程序員面試

2019-03-25 07:14:57

程序員工程師職業(yè)

2014-09-23 10:12:38

程序員

2020-09-15 06:13:05

Vue.jsJavaScript框架

2022-07-15 08:20:54

Java基礎(chǔ)知識(shí)

2015-09-16 09:57:41

swoolePHP程序員

2019-11-28 10:53:19

程序員技能開發(fā)者

2018-09-06 13:06:46

程序員焦慮谷歌

2009-04-17 15:48:41

程序員價(jià)值

2020-06-28 09:08:08

Java語(yǔ)法塊開發(fā)

2015-10-29 13:13:39

.NET程序員開發(fā)工具
點(diǎn)贊
收藏

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

亚洲欧洲日韩综合| 一本久久a久久精品vr综合 | 亚洲最新视频在线播放| 3d动漫啪啪精品一区二区免费| 久久久久久久中文字幕| 色婷婷av一区二区三区丝袜美腿| 91成人在线免费观看| 亚洲精品偷拍视频| 天天舔天天干天天操| 免费人成在线不卡| 欧美日韩福利在线观看| 91成人破解版| 久久久91麻豆精品国产一区| 狠狠干狠狠久久| 三年中文高清在线观看第6集| 成人小说亚洲一区二区三区| 免费在线观看精品| 97涩涩爰在线观看亚洲| 免费看一级黄色| 欧美黑白配在线| 在线不卡免费av| 午夜精品久久久久久久无码| 尤物网址在线观看| 成人网页在线观看| 91精品国产综合久久香蕉922| 日韩免费av片| 欧美激情视频一区二区三区免费| 亚洲人成电影网站色| 日韩精品国产一区| 日韩在线激情| 欧美性大战久久久| 国产成人在线免费看| 日韩av官网| 国产精品久久久久一区| 久久综合九九| 天天操天天干天天插| 国精产品一区一区三区mba视频| 51ⅴ精品国产91久久久久久| 久久老司机精品视频| 日韩一区二区在线| 国产午夜精品一区二区三区| av网站有哪些| 国产福利一区二区精品秒拍| 911精品产国品一二三产区| 六月丁香婷婷激情| 老色鬼在线视频| 亚洲午夜久久久久中文字幕久| 一本一本a久久| 成人在线免费电影| 国产亚洲综合性久久久影院| 久久国产精品 国产精品| 亚洲第一天堂影院| 国产成人精品午夜视频免费| 91精品视频专区| 在线观看色网站| 蜜桃av噜噜一区| 国产精品91久久| 亚洲中文无码av在线| 久久尤物视频| 国产精品∨欧美精品v日韩精品| 一级黄色免费网站| 麻豆精品91| 国产精品pans私拍| 成人毛片一区二区三区| 日韩在线卡一卡二| 国产精品偷伦免费视频观看的| 做爰视频毛片视频| 久久99国产精品久久99果冻传媒| 91精品久久久久久久| 亚洲综合五月天婷婷丁香| 久草热8精品视频在线观看| 国产免费一区二区三区在线观看| 一区二区三区日| 国产麻豆视频一区二区| 官网99热精品| 亚洲人视频在线观看| 26uuu欧美| 日韩av一级大片| 欧美成人三区| 亚洲国产欧美在线人成| 欧美 丝袜 自拍 制服 另类| 日产精品一区| 日韩一级片在线观看| 免费在线观看日韩av| 日本一道高清一区二区三区| 国产一区二区三区毛片| 黄色a级片在线观看| 亚洲一级特黄| 国产精品成人免费电影| 国产三级三级在线观看| 成人午夜视频免费看| 激情小说综合区| 91精彩视频在线观看| 亚洲精品国产成人久久av盗摄| 亚洲一区二区三区av无码| 成人欧美大片| 911国产精品| 中文字幕 亚洲一区| 日韩精品一区二区三区免费观看| 久久6免费高清热精品| 草久久免费视频| 黑人巨大精品欧美一区| 精品国产乱码久久久久| 91欧美在线视频| 午夜婷婷国产麻豆精品| 不卡av免费在线| 草草视频在线一区二区| 亚洲新声在线观看| 九九九国产视频| 美女精品一区二区| 黑人另类av| 国产在线观看a| 色婷婷综合久久久中文一区二区| 亚洲五月激情网| 精品欧美激情在线观看| 欧美乱大交xxxxx| 久久精品国产亚洲av麻豆蜜芽| 成人久久18免费网站麻豆| 相泽南亚洲一区二区在线播放| 丰满的护士2在线观看高清| 欧美男人的天堂一二区| 中文字幕一区二区三区人妻电影| 亚洲最大av| 国产精品成人国产乱一区| 熟妇高潮一区二区高潮| 亚洲精品大片www| 特级丰满少妇一级| 欧美人与牛zoz0性行为| 久久久久久国产免费| 国产精品一级二级| 欧美极品美女视频| 日韩欧美精品在线观看视频| 成人搞黄视频| 欧美巨猛xxxx猛交黑人97人| 亚洲视频一区二区三区四区| 99久久精品国产精品久久| 国产免费内射又粗又爽密桃视频| 日韩av黄色| 亚洲最新视频在线| 五月天婷婷导航| 久久影音资源网| 九色在线视频观看| 精品国内亚洲2022精品成人| 欧美第一淫aaasss性| 国产毛片久久久久| 国产精品第一页第二页第三页| 欧美日韩亚洲一二三| 亚洲精华一区二区三区| 欧美中文在线字幕| 亚洲欧美日韩免费| 欧美日韩美女在线| 国产乱了高清露脸对白| 亚洲美女一区| 久久96国产精品久久99软件| 日韩精品av| 国产手机视频精品| 日本免费在线观看视频| 久久亚洲综合色一区二区三区| 国产日产欧美视频| 亚洲第一二三区| 国产成人精品电影久久久| 色av男人的天堂免费在线| 欧美日韩国产综合新一区| 国产精品300页| 久久精品导航| 亚洲图片欧洲图片日韩av| 成人做爰免费视频免费看| 中文字幕日韩有码| 国产又黄又粗又硬| 一区二区三区 在线观看视频| 四虎永久免费观看| 日韩视频精品在线观看| 欧美日韩国产一二| 久久人人视频| 久久久久久久爱| 国产三级电影在线观看| 欧美日韩国产系列| 欧美成人精品一区二区免费看片| 岛国精品一区二区| 国模无码视频一区二区三区| 日韩精品诱惑一区?区三区| 国产在线精品播放| 午夜dj在线观看高清视频完整版| 亚洲高清不卡av| 99久久久无码国产精品免费蜜柚| 国产精品私人自拍| 亚洲综合在线一区二区| 在线免费高清一区二区三区| 欧美日韩天天操| 久久婷婷五月综合色丁香| 久久视频精品在线| 天堂在线免费av| 欧美一区二区激情视频| 国产精品久久久久一区| 国产性生活毛片| 精品制服美女久久| 国产一区二区在线视频播放| 日韩情爱电影在线观看| 国产精品有限公司| 91av一区| 亚洲18私人小影院| 日本免费在线视频| 日韩精品亚洲视频| 精品人妻无码一区二区三区蜜桃一| 欧美日韩一二三四五区| 爱爱视频免费在线观看| 99久久精品免费看| 最新av免费在线观看| 久久国产精品亚洲77777| 丰满女人性猛交| 国产一区二区观看| 国产精品三区www17con| 国产精品伦一区二区| 97成人精品区在线播放| 成人看av片| 丝袜一区二区三区| 免费成人av电影| 亚洲成人激情视频| 国产美女无遮挡永久免费| 欧美性猛交xxxx乱大交退制版 | 日韩欧美国产黄色| 中文字幕另类日韩欧美亚洲嫩草| 国产性天天综合网| 在线观看国产网站| 国产99久久久精品| 性欧美在线视频| 日韩av电影天堂| 大香煮伊手机一区| 99在线精品视频在线观看| 潘金莲一级淫片aaaaa免费看| 欧美日韩在线观看视频小说| 久久精精品视频| 欧美亚洲色图校园春色| 99www免费人成精品| 国产精品3区| 国产日韩中文字幕在线| 欧洲精品一区二区三区| 欧洲美女免费图片一区| av最新在线| 97久久伊人激情网| 国产精选在线| 69精品小视频| 亚洲男人av| 日本sm极度另类视频| 国产99在线| 3344国产精品免费看| 中文在线最新版地址| 91成人在线视频| 在线看的毛片| 日本高清不卡在线| 超级碰碰久久| 国产精品成人一区二区| 小明成人免费视频一区| 国产精品久久久久久久久久久久久久 | 成人精品视频| 亚洲aⅴ天堂av在线电影软件| 第一社区sis001原创亚洲| 色999日韩自偷自拍美女| av中字幕久久| 久久av秘一区二区三区| 一区二区在线| www.日本少妇| 亚洲在线日韩| 欧美一级黄色片视频| 日日夜夜精品免费视频| 男人搞女人网站| 精品亚洲欧美一区| 男生和女生一起差差差视频| 国产成人精品一区二| av鲁丝一区鲁丝二区鲁丝三区| 97se狠狠狠综合亚洲狠狠| 久久精品成人av| 国产精品入口麻豆原神| 成人免费精品动漫网站| 亚洲影院在线观看| 五月婷婷中文字幕| 欧美色倩网站大全免费| av男人天堂网| 日韩电影在线观看中文字幕| 98在线视频| 欧美二区乱c黑人| 成人直播视频| 成人h视频在线| 国产一区二区三区亚洲| 欧美下载看逼逼| 正在播放日韩欧美一页| 奇米精品一区二区三区| 欧美a级一区二区| 午夜性福利视频| 欧美极品另类videosde| 欧美日韩精品在线观看视频| 黑丝美女久久久| www精品国产| 亚洲网站在线播放| 在线h片观看| 国产成人亚洲精品| 秋霞一区二区三区| 日本免费高清一区| 国产主播精品| 中文av一区二区三区| 成人黄色a**站在线观看| ass极品国模人体欣赏| 亚洲线精品一区二区三区| av首页在线观看| 亚洲国产精久久久久久| 素人av在线| 国产成人福利视频| 国产劲爆久久| 国产精品久久成人免费观看| 久久一区精品| 182在线视频| 亚洲男人的天堂av| 国产裸体美女永久免费无遮挡| 精品国产百合女同互慰| 思思99re6国产在线播放| 7m第一福利500精品视频| 精品中文字幕一区二区三区四区| 日本精品免费| 一级成人国产| 美女扒开腿免费视频| 亚洲欧洲精品一区二区三区不卡| 免费观看日批视频| 日韩高清不卡av| 性欧美videos高清hd4k| 成人精品网站在线观看| 国产欧美日韩在线观看视频| 欧日韩免费视频| 国产成人一区二区精品非洲| 国产三级aaa| 欧洲视频一区二区| 久久精品蜜桃| 欧美专区第一页| 老司机精品在线| 国产一二三在线视频| www.av成人| 亚洲欧美一区二区视频| 在线观看毛片av| 一色桃子一区二区| 成人激情综合| 日韩久久久久久久| 久久综合图片| 亚洲国产天堂av| 欧美在线综合视频| 成人免费在线观看| 国产精品一区二区久久久久 | 日本不卡免费新一二三区| 国产精品美女久久久| 日本黄色动态图| 欧美日韩美女在线观看| 男人的天堂在线视频| 欧美中文字幕在线| 成人6969www免费视频| 日日噜噜夜夜狠狠| |精品福利一区二区三区| 国产精品人人妻人人爽| 久久亚洲精品中文字幕冲田杏梨| 国产成人视屏| 菠萝蜜视频在线观看入口| 成人性生交大片免费看中文网站| 日韩人妻无码一区二区三区99 | 亚洲综合精品伊人久久| 欧美在线精品一区| 午夜男人的天堂| 色综合久久久久久久| 午夜激情视频在线| 亚洲一区亚洲二区亚洲三区| 亚洲国产日韩在线| 91久久免费视频| 欧美日韩成人一区二区| 中国av在线播放| 久久国产主播精品| 日韩av午夜在线观看| 91麻豆精品成人一区二区| 精品蜜桃在线看| 周于希免费高清在线观看| 视频在线精品一区| 国产伦精品一区二区三区免费 | 99色在线观看| 日韩不卡av| 国产精品一色哟哟哟| 亚洲欧美在线视频免费| 一区二区三欧美| 日韩精品成人| 黄色成人免费看| 亚洲欧美日韩小说| 五月婷婷久久久| 国产日本欧美一区| 亚洲国产免费| 久久国产波多野结衣| 精品福利一区二区三区| 成人啊v在线| 国产日韩亚洲欧美在线| 欧美极品aⅴ影院| 午夜av免费在线观看| 国产欧美va欧美va香蕉在线| 亚洲三级观看| 国产精品久久久免费看| 日韩黄色在线免费观看| 国产95亚洲| 日本va中文字幕|