day05 【異常、線程】

day05 【異常裹赴、線程】

主要內容

  • 異常睛低、線程

教學目標

  • 能夠辨別程序中異常和錯誤的區(qū)別
  • 說出異常的分類
  • 說出虛擬機處理異常的方式
  • 列舉出常見的三個運行期異常
  • 能夠使用try...catch關鍵字處理異常
  • 能夠使用throws關鍵字處理異常
  • 能夠自定義異常類
  • 能夠處理自定義異常類
  • 說出進程的概念
  • 說出線程的概念
  • 能夠理解并發(fā)與并行的區(qū)別
  • 能夠開啟新線程

第一章 異常

1.1 異常概念

異常,就是不正常的意思磕昼。在生活中:醫(yī)生說,你的身體某個部位有異常,該部位和正常相比有點不同,該部位的功能將受影響.在程序中的意思就是:

  • 異常 :指的是程序在執(zhí)行過程中卷雕,出現(xiàn)的非正常的情況,最終會導致JVM的非正常停止票从。

在Java等面向對象的編程語言中漫雕,異常本身是一個類,產(chǎn)生異常就是創(chuàng)建異常對象并拋出了一個異常對象纫骑。Java處理異常的方式是中斷處理蝎亚。

異常指的并不是語法錯誤,語法錯了,編譯不通過,不會產(chǎn)生字節(jié)碼文件,根本不能運行.

1.2 異常體系

異常機制其實是幫助我們找到程序中的問題,異常的根類是java.lang.Throwable先馆,其下有兩個子類:java.lang.Errorjava.lang.Exception发框,平常所說的異常指java.lang.Exception

[圖片上傳失敗...(image-61d38a-1584365358558)]

Throwable體系:

  • Error:嚴重錯誤Error煤墙,無法通過處理的錯誤梅惯,只能事先避免,好比絕癥仿野。
  • Exception:表示異常铣减,異常產(chǎn)生后程序員可以通過代碼的方式糾正,使程序繼續(xù)運行脚作,是必須要處理的葫哗。好比感冒、闌尾炎球涛。

Throwable中的常用方法:

  • public void printStackTrace():打印異常的詳細信息劣针。

    包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開發(fā)和調試階段,都得使用printStackTrace。

  • public String getMessage():獲取發(fā)生異常的原因亿扁。

    提示給用戶的時候,就提示錯誤原因捺典。

  • public String toString():獲取異常的類型和異常描述信息(不用)。

出現(xiàn)異常,不要緊張,把異常的簡單類名,拷貝到API中去查从祝。

[圖片上傳失敗...(image-d2dff0-1584365358558)]

1.3 異常分類

我們平常說的異常就是指Exception襟己,因為這類異常一旦出現(xiàn),我們就要對代碼進行更正牍陌,修復程序擎浴。

異常(Exception)的分類:根據(jù)在編譯時期還是運行時期去檢查異常?

  • 編譯時期異常:checked異常估盘。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗湿蛔。(如日期格式化異常)
  • 運行時期異常:runtime異常比搭。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)匣砖。(如數(shù)學異常)

? [圖片上傳失敗...(image-89c3ac-1584365358558)]

1.4 異常的產(chǎn)生過程解析

先運行下面的程序沾鳄,程序會產(chǎn)生一個數(shù)組索引越界異常ArrayIndexOfBoundsException淆储。我們通過圖解來解析下異常產(chǎn)生的過程潭千。

工具類

public class ArrayTools {
    // 對給定的數(shù)組通過給定的角標獲取元素躏率。
    public static int getElement(int[] arr, int index) {
        int element = arr[index];
        return element;
    }
}

測試類

public class ExceptionDemo {
    public static void main(String[] args) {
        int[] arr = { 34, 12, 67 };
        intnum = ArrayTools.getElement(arr, 4)
        System.out.println("num=" + num);
        System.out.println("over");
    }
}

上述程序執(zhí)行過程圖解:

[圖片上傳失敗...(image-aebbb7-1584365358558)]

第二章 異常的處理

Java異常處理的五個關鍵字:try怀泊、catch茫藏、finally、throw霹琼、throws

2.1 拋出異常throw

在編寫程序時务傲,我們必須要考慮程序出現(xiàn)問題的情況。比如枣申,在定義方法時售葡,方法需要接受參數(shù)。那么忠藤,當調用方法使用接受到的參數(shù)時挟伙,首先需要先對參數(shù)數(shù)據(jù)進行合法的判斷,數(shù)據(jù)若不合法模孩,就應該告訴調用者尖阔,傳遞合法的數(shù)據(jù)進來。這時需要使用拋出異常的方式來告訴調用者榨咐。

在java中介却,提供了一個throw關鍵字,它用來拋出一個指定的異常對象块茁。那么齿坷,拋出一個異常具體如何操作呢?

  1. 創(chuàng)建一個異常對象数焊。封裝一些提示信息(信息可以自己編寫)永淌。

  2. 需要將這個異常對象告知給調用者。怎么告知呢昌跌?怎么將這個異常對象傳遞到調用者處呢仰禀?通過關鍵字throw就可以完成。throw 異常對象蚕愤。

    throw用在方法內答恶,用來拋出一個異常對象,將這個異常對象傳遞到調用者處萍诱,并結束當前方法的執(zhí)行悬嗓。

使用格式:

throw new 異常類名(參數(shù));

例如:

throw new NullPointerException("要訪問的arr數(shù)組不存在");

throw new ArrayIndexOutOfBoundsException("該索引在數(shù)組中不存在裕坊,已超出范圍");

學習完拋出異常的格式后,我們通過下面程序演示下throw的使用周瞎。

public class ThrowDemo {
    public static void main(String[] args) {
        //創(chuàng)建一個數(shù)組 
        int[] arr = {2,4,52,2};
        //根據(jù)索引找對應的元素 
        int index = 4;
        int element = getElement(arr, index);

        System.out.println(element);
        System.out.println("over");
    }
    /*
     * 根據(jù) 索引找到數(shù)組中對應的元素
     */
    public static int getElement(int[] arr,int index){ 
        //判斷  索引是否越界
        if(index<0 || index>arr.length-1){
             /*
             判斷條件如果滿足苗缩,當執(zhí)行完throw拋出異常對象后,方法已經(jīng)無法繼續(xù)運算酱讶。
             這時就會結束當前方法的執(zhí)行,并將異常告知給調用者泻肯。這時就需要通過異常來解決。 
              */
             throw new ArrayIndexOutOfBoundsException("哥們慰照,角標越界了~~~");
        }
        int element = arr[index];
        return element;
    }
}

注意:如果產(chǎn)生了問題灶挟,我們就會throw將問題描述類即異常進行拋出毒租,也就是將問題返回給該方法的調用者。

那么對于調用者來說榛泛,該怎么處理呢噩斟?一種是進行捕獲處理,另一種就是繼續(xù)講問題聲明出去剃允,使用throws聲明處理。

2.2 Objects非空判斷

還記得我們學習過一個類Objects嗎椒楣,曾經(jīng)提到過它由一些靜態(tài)的實用方法組成牡肉,這些方法是null-save(空指針安全的)或null-tolerant(容忍空指針的),那么在它的源碼中毛俏,對對象為null的值進行了拋出異常操作饲窿。

  • public static <T> T requireNonNull(T obj):查看指定引用對象不是null。

查看源碼發(fā)現(xiàn)這里對為null的進行了拋出異常操作:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

2.3 聲明異常throws

聲明異常:將問題標識出來阀溶,報告給調用者。如果方法內通過throw拋出了編譯時異常银锻,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進行聲明腐碱,讓調用者去處理掉弛。

關鍵字throws運用于方法聲明之上,用于表示當前方法不處理異常,而是提醒該方法的調用者來處理異常(拋出異常).

聲明異常格式:

修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2…{   }  

聲明異常的代碼演示:

public class ThrowsDemo {
    public static void main(String[] args) throws FileNotFoundException {
        read("a.txt");
    }

    // 如果定義功能時有問題發(fā)生需要報告給調用者殃饿∮蟪Γ可以通過在方法上使用throws關鍵字進行聲明
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

throws用于進行異常類的聲明乎芳,若該方法可能有多種異常情況產(chǎn)生帖池,那么在throws后面可以寫多個異常類睡汹,用逗號隔開。

public class ThrowsDemo2 {
    public static void main(String[] args) throws IOException {
        read("a.txt");
    }

    public static void read(String path)throws FileNotFoundException, IOException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

2.4 捕獲異常try…catch

如果異常出現(xiàn)的話,會立刻終止程序,所以我們得處理異常:

  1. 該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws)原在。
  2. 在方法中使用try-catch的語句塊來處理異常。

try-catch的方式就是捕獲異常彤叉。

  • 捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現(xiàn)的異常進行指定方式的處理浮庐。

捕獲異常語法如下:

try{
     編寫可能會出現(xiàn)異常的代碼
}catch(異常類型  e){
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}

try:該代碼塊中編寫可能產(chǎn)生異常的代碼柬焕。

catch:用來進行某種異常的捕獲,實現(xiàn)對捕獲到的異常進行處理维苔。

注意:try和catch都不能單獨使用,必須連用。

演示如下:

public class TryCatchDemo {
    public static void main(String[] args) {
        try {// 當產(chǎn)生異常時介时,必須有處理方式。要么捕獲循衰,要么聲明褐澎。
            read("b.txt");
        } catch (FileNotFoundException e) {// 括號中需要定義什么呢?
            //try中拋出的是什么異常工三,在括號中就定義什么異常類型
            System.out.println(e);
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當前的這個方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

如何獲取異常信息:

Throwable類中定義了一些查看方法:

  • public String getMessage():獲取異常的描述信息,原因(提示給用戶的時候,就提示錯誤原因俭正。
  • public String toString():獲取異常的類型和異常描述信息(不用)。
  • public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺串远。

? 包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開發(fā)和調試階段,都得使用printStackTrace儿惫。

2.4 finally 代碼塊

finally:有一些特定的代碼無論異常是否發(fā)生,都需要執(zhí)行留搔。另外铛铁,因為異常會引發(fā)程序跳轉避归,導致有些語句執(zhí)行不到。而finally就是解決這個問題的梳毙,在finally代碼塊中存放的代碼都是一定會被執(zhí)行的账锹。

什么時候的代碼必須最終執(zhí)行?

當我們在try語句塊中打開了一些物理資源(磁盤文件/網(wǎng)絡連接/數(shù)據(jù)庫連接等),我們都得在使用完之后,最終關閉打開的資源生年。

finally的語法:

try...catch....finally:自身需要處理異常,最終還得關閉資源廓奕。

注意:finally不能單獨使用档叔。

比如在我們之后學習的IO流中蒸绩,當打開了一個關聯(lián)文件的資源患亿,最后程序不管結果如何,都需要把這個資源關閉掉步藕。

finally代碼參考如下:

public class TryCatchDemo4 {
    public static void main(String[] args) {
        try {
            read("a.txt");
        } catch (FileNotFoundException e) {
            //抓取到的是編譯期異常  拋出去的是運行期 
            throw new RuntimeException(e);
        } finally {
            System.out.println("不管程序怎樣咙冗,這里都將會被執(zhí)行。");
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當前的這個方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

當只有在try或者catch中調用退出JVM的相關方法,此時finally才不會執(zhí)行,否則finally永遠會執(zhí)行。

[圖片上傳失敗...(image-42cdff-1584365358558)]

2.5 異常注意事項

  • 多個異常使用捕獲又該如何處理呢仪或?

    1. 多個異常分別處理士骤。
    2. 多個異常一次捕獲,多次處理到旦。
    3. 多個異常一次捕獲一次處理巨缘。

    一般我們是使用一次捕獲多次處理方式,格式如下:

    try{
         編寫可能會出現(xiàn)異常的代碼
    }catch(異常類型A  e){  當try中出現(xiàn)A類型異常,就用該catch來捕獲.
         處理異常的代碼
         //記錄日志/打印異常信息/繼續(xù)拋出異常
    }catch(異常類型B  e){  當try中出現(xiàn)B類型異常,就用該catch來捕獲.
         處理異常的代碼
         //記錄日志/打印異常信息/繼續(xù)拋出異常
    }
    

    注意:這種異常處理方式搁骑,要求多個catch中的異常不能相同又固,并且若catch中的多個異常之間有子父類異常的關系,那么子類異常要求在上面的catch處理仰冠,父類異常在下面的catch處理洋只。

  • 運行時異常被拋出可以不處理昼捍。即不捕獲也不聲明拋出众辨。

  • 如果finally有return語句,永遠返回finally中的結果,避免該情況.

  • 如果父類拋出了多個異常,子類重寫父類方法時,拋出和父類相同的異常或者是父類異常的子類或者不拋出異常鹃彻。

  • 父類方法沒有拋出異常,子類重寫父類該方法時也不可拋出異常团赁。此時子類產(chǎn)生該異常谨履,只能捕獲處理笋粟,不能聲明拋出

第三章 自定義異常

3.1 概述

為什么需要自定義異常類:

我們說了Java中不同的異常類,分別表示著某一種具體的異常情況,那么在開發(fā)中總是有些異常情況是SUN沒有定義好的,此時我們根據(jù)自己業(yè)務的異常情況來定義異常類。例如年齡負數(shù)問題,考試成績負數(shù)問題等等绿淋。

在上述代碼中尝盼,發(fā)現(xiàn)這些異常都是JDK內部定義好的,但是實際開發(fā)中也會出現(xiàn)很多異常,這些異常很可能在JDK中沒有定義過,例如年齡負數(shù)問題,考試成績負數(shù)問題.那么能不能自己定義異常呢裁赠?

什么是自定義異常類:

在開發(fā)中根據(jù)自己業(yè)務的異常情況來定義異常類.

自定義一個業(yè)務邏輯異常: RegisterException赴精。一個注冊異常類。

異常類如何定義:

  1. 自定義一個編譯期異常: 自定義類 并繼承于java.lang.Exception失尖。
  2. 自定義一個運行時期的異常類:自定義類 并繼承于java.lang.RuntimeException渐苏。

3.2 自定義異常的練習

要求:我們模擬注冊操作琼富,如果用戶名已存在,則拋出異常并提示:親薯鼠,該用戶名已經(jīng)被注冊。

首先定義一個登陸異常類RegisterException:

// 業(yè)務邏輯異常
public class RegisterException extends Exception {
    /**
     * 空參構造
     */
    public RegisterException() {
    }

    /**
     *
     * @param message 表示異常提示
     */
    public RegisterException(String message) {
        super(message);
    }
}

模擬登陸操作羞芍,使用數(shù)組模擬數(shù)據(jù)庫中存儲的數(shù)據(jù)郊艘,并提供當前注冊賬號是否存在方法用于判斷。

public class Demo {
    // 模擬數(shù)據(jù)庫中已存在賬號
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {     
        //調用方法
        try{
              // 可能出現(xiàn)異常的代碼
            checkUsername("nill");
            System.out.println("注冊成功");//如果沒有異常就是注冊成功
        }catch(RegisterException e){
            //處理異常
            e.printStackTrace();
        }
    }

    //判斷當前注冊賬號是否存在
    //因為是編譯期異常畏浆,又想調用者去處理 所以聲明該異常
    public static boolean checkUsername(String uname) throws LoginException{
        for (String name : names) {
            if(name.equals(uname)){//如果名字在這里面 就拋出登陸異常
                throw new RegisterException("親"+name+"已經(jīng)被注冊了刻获!");
            }
        }
        return true;
    }
}

第四章 多線程

我們在之前瞎嬉,學習的程序在沒有跳轉語句的前提下,都是由上至下依次執(zhí)行沐兵,那現(xiàn)在想要設計一個程序挑胸,邊打游戲邊聽歌宰闰,怎么設計?

要解決上述問題,咱們得使用多進程或者多線程來解決.

4.1 并發(fā)與并行

  • 并發(fā):指兩個或多個事件在同一個時間段內發(fā)生解藻。
  • 并行:指兩個或多個事件在同一時刻發(fā)生(同時發(fā)生)葡盗。

[圖片上傳失敗...(image-f1df88-1584365358558)]

在操作系統(tǒng)中觅够,安裝了多個程序,并發(fā)指的是在一段時間內宏觀上有多個程序同時運行钳吟,這在單 CPU 系統(tǒng)中窘拯,每一時刻只能有一道程序執(zhí)行坝茎,即微觀上這些程序是分時的交替運行暇番,只不過是給人的感覺是同時運行壁酬,那是因為分時交替運行的時間是非常短的。

而在多個 CPU 系統(tǒng)中和措,則這些可以并發(fā)執(zhí)行的程序便可以分配到多個處理器上(CPU)蜕煌,實現(xiàn)多任務并行執(zhí)行,即利用每個處理器來處理一個可以并發(fā)執(zhí)行的程序贫母,這樣多個程序便可以同時執(zhí)行盒刚。目前電腦市場上說的多核 CPU,便是多核處理器橘原,核 越多涡上,并行處理的程序越多吩愧,能大大的提高電腦運行的效率。

注意:單核處理器的計算機肯定是不能并行的處理多個任務的脐帝,只能是多個任務在單個CPU上并發(fā)運行糖权。同理,線程也是一樣的,從宏觀角度上理解線程是并行運行的疚顷,但是從微觀角度上分析卻是串行運行的募判,即一個線程一個線程的去運行咒唆,當系統(tǒng)只有一個CPU時全释,線程會以某種順序執(zhí)行多個線程误债,我們把這種情況稱之為線程調度。

4.2 線程與進程

  • 進程:是指一個內存中運行的應用程序李命,每個進程都有一個獨立的內存空間箫老,一個應用程序可以同時運行多個進程耍鬓;進程也是程序的一次執(zhí)行過程,是系統(tǒng)運行程序的基本單位笆制;系統(tǒng)運行一個程序即是一個進程從創(chuàng)建涣达、運行到消亡的過程。

  • 線程:線程是進程中的一個執(zhí)行單元匆篓,負責當前進程中程序的執(zhí)行林螃,一個進程中至少有一個線程俺泣。一個進程中是可以有多個線程的伏钠,這個應用程序也可以稱之為多線程程序。

    簡而言之:一個程序運行后至少有一個進程缎浇,一個進程中可以包含多個線程

我們可以再電腦底部任務欄赴肚,右鍵----->打開任務管理器,可以查看當前任務的進程:

進程

[圖片上傳失敗...(image-a6bec1-1584365358558)]

線程

[圖片上傳失敗...(image-b329a8-1584365358558)]

線程調度:

  • 分時調度

    所有線程輪流使用 CPU 的使用權,平均分配每個線程占用 CPU 的時間指厌。

  • 搶占式調度

    優(yōu)先讓優(yōu)先級高的線程使用 CPU踩验,如果線程的優(yōu)先級相同,那么會隨機選擇一個(線程隨機性)牡借,Java使用的為搶占式調度袭异。

    • 設置線程的優(yōu)先級

    [圖片上傳失敗...(image-1c5aee-1584365358558)]

    • 搶占式調度詳解

      大部分操作系統(tǒng)都支持多進程并發(fā)運行,現(xiàn)在的操作系統(tǒng)幾乎都支持同時運行多個程序俊鱼。比如:現(xiàn)在我們上課一邊使用編輯器并闲,一邊使用錄屏軟件谷羞,同時還開著畫圖板,dos窗口等軟件犀填。此時嗓违,這些程序是在同時運行,”感覺這些軟件好像在同一時刻運行著“冕广。

      實際上偿洁,CPU(中央處理器)使用搶占式調度模式在多個線程間進行著高速的切換涕滋。對于CPU的一個核而言,某個時刻溯饵,只能執(zhí)行一個線程,而 CPU的在多個線程間切換速度相對我們的感覺要快坡慌,看上去就是在同一時刻運行藻三。
      其實棵帽,多線程程序并不能提高程序的運行速度,但能夠提高程序運行效率弟晚,讓CPU的使用率更高逾苫。

      [圖片上傳失敗...(image-b48a5e-1584365358558)]

4.3 創(chuàng)建線程類

Java使用java.lang.Thread類代表線程,所有的線程對象都必須是Thread類或其子類的實例瑟押。每個線程的作用是完成一定的任務多望,實際上就是執(zhí)行一段程序流即一段順序執(zhí)行的代碼氢烘。Java使用線程執(zhí)行體來代表這段程序流。Java中通過繼承Thread類來創(chuàng)建啟動多線程的步驟如下:

  1. 定義Thread類的子類椎工,并重寫該類的run()方法蜀踏,該run()方法的方法體就代表了線程需要完成的任務,因此把run()方法稱為線程執(zhí)行體脓斩。
  2. 創(chuàng)建Thread子類的實例畴栖,即創(chuàng)建了線程對象
  3. 調用線程對象的start()方法來啟動該線程

代碼如下:

測試類:

public class Demo01 {
    public static void main(String[] args) {
        //創(chuàng)建自定義線程對象
        MyThread mt = new MyThread("新的線程!");
        //開啟新線程
        mt.start();
        //在主方法中執(zhí)行for循環(huán)
        for (int i = 0; i < 10; i++) {
            System.out.println("main線程燎猛!"+i);
        }
    }
}

自定義線程類:

public class MyThread extends Thread {
    //定義指定線程名稱的構造方法
    public MyThread(String name) {
        //調用父類的String參數(shù)的構造方法重绷,指定線程的名稱
        super(name);
    }
    /**
     * 重寫run方法,完成該線程執(zhí)行的邏輯
     */
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName()+":正在執(zhí)行愤钾!"+i);
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末能颁,一起剝皮案震驚了整個濱河市倒淫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镜硕,老刑警劉巖兴枯,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矩欠,死亡現(xiàn)場離奇詭異晚顷,居然都是意外死亡,警方通過查閱死者的電腦和手機瞳氓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門匣摘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裹刮,“玉大人,你說我怎么就攤上這事赠叼。” “怎么了瞬场?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵贯被,是天一觀的道長妆艘。 經(jīng)常有香客問我批旺,道長,這世上最難降的妖魔是什么苞轿? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任逗物,我火速辦了婚禮翎卓,結果婚禮上,老公的妹妹穿的比我還像新娘坯门。我一直安慰自己逗扒,他們只是感情好矩肩,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黍檩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喳逛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天棵里,我揣著相機與錄音润文,去河邊找鬼姐呐。 笑死,一個胖子當著我的面吹牛转唉,可吹牛的內容都是我干的皮钠。 我是一名探鬼主播稳捆,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼赠法,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砖织?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤末荐,失蹤者是張志新(化名)和其女友劉穎侧纯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甲脏,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡眶熬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了块请。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜氏。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖墩新,靈堂內的尸體忽然破棺而出贸弥,到底是詐尸還是另有隱情,我是刑警寧澤海渊,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布绵疲,位于F島的核電站,受9級特大地震影響臣疑,放射性物質發(fā)生泄漏盔憨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一讯沈、第九天 我趴在偏房一處隱蔽的房頂上張望般渡。 院中可真熱鬧,春花似錦芙盘、人聲如沸驯用。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝴乔。三九已至,卻和暖如春驮樊,著一層夾襖步出監(jiān)牢的瞬間薇正,已是汗流浹背片酝。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挖腰,地道東北人雕沿。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像猴仑,于是被迫代替她去往敵國和親审轮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容