c++ raiseexception产生异常_Day17_异常,线程
生活随笔
收集整理的這篇文章主要介紹了
c++ raiseexception产生异常_Day17_异常,线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《Java自學180天筆記》
異常分類
package demo3;/*java.lang.Throwable:類是Java語言中所有錯誤或異常的超類。 Exception:編譯期異常,進行編譯(寫代碼)java程序出現的問題 RuntimeException:運行期異常,java程序運行過程中出現的問題 異常就相當于程序得了一個小毛病,把異常處理掉,程序可以繼續執行 Error:錯誤 錯誤就相當于程序得了一個無法治愈的毛病,必須修改源代碼,程序才能繼續執行 */public class DemoException { public static void main(String[] args) { }}異常的產生過程解析
throw關鍵字
package demo3;/*throw關鍵字作用: 可以使用throw關鍵字在指定的方法中拋出指定的異常使用格式: throw new xxxException("異常產生的原因");注意: 1.throw關鍵字必須寫在方法的內部 2.throw關鍵字后邊new的對象必須是Exception或者Exception的子類對象 3.throw關鍵字拋出指定異常對象,我們就必須處理這個異常對象 throw關鍵字后面創建的是RuntimeException或者RuntimeException的子類對象,我們可以不處理, 默認交給JVM處理(打印異常對象,中斷程序) throw關鍵字后面創建的是編譯異常(寫代碼的時候報錯),我們就必須處理這個異常,要么throws, 要么try...catch */public class DemoThrow { public static void main(String[] args) { }}throws關鍵字_異常處理的第一種方式,交給別人處理
package demo3;import java.io.FileNotFoundException;import java.io.IOException;/*throws關鍵字:異常處理的第一種方式,交給別人處理作用: 當方法內部拋出異常對象的時候,那么我們就必須處理這個異常對象 可以使用throws關鍵字處理異常對象,會把異常對象聲明拋出給方法的調用者處理 (自己不處理,給別人處理),最終交給JVM處理-->中斷處理使用格式:在方法聲明時使用 修飾符 返回值類型 方法名(參數列表)throws AAAException,BBBException...{ throw new AAAException("產生原因") throw new BBBException("產生原因") ... }注意: 1.throws關鍵字必須寫在方法聲明處 2.throws關鍵字后邊聲明的異常必須是Exception或者Exception的子類 3.方法內部如果拋出了多個異常對象,那么throws后邊必須也聲明多個異常 如果拋出多個異常對象有父子關系,那么 直接聲明父類異常即可 4.調用一個聲明拋出異常的方法,我們就必須的處理聲明的異常 要么繼續使用throws聲明拋出,交給方法的調用者算是,最終交給JVM 要么try...catch自己處理異常 */public class DemoThrows { /* FileNotFoundException extends IOException extends Exception 如果拋出的多個異常對象有父子類關系,那么直接聲明父類異常即可。 */ public static void main(String[] args) throws FileNotFoundException,IOException { readFile("c:\\a.txt"); } /* 定義一個諒,對傳遞的方便路徑進行合法性判斷 如果路徑不是"c:\\a.txt",那么我們就拋出文件找不到異常對象,告知方法的調用者 注意: FileNotFoundException是編譯異常,拋出了編譯異常,就必須處理這個異常 可以使用throws繼續聲明拋出FileNotFoundException這個異常對象,讓方法的調用者處理 */ public static void readFile(String fileName) throws FileNotFoundException,IOException { if(!fileName.equals("c:\\a.txt")){ throw new IOException("文件的后綴名不對"); } /* 如果傳遞的路徑,不是.txt結尾 那么 我們就拋出IO異常對象,告知方法的調用者,文件的后綴名不對 */ if(!fileName.endsWith(".txt")){ throw new FileNotFoundException("傳遞的文件路徑不是c:\\a.txt"); } System.out.println("路徑沒有問題,讀取文件"); }}throws關鍵字_異常處理的第一種方式,自己處理異常
package demo3;/*try...catch:異常處理的第二種方式,自己處理異常格式: try{ 可能產生異常的代碼 }catch(定義一個異常的變量,用來接收try中拋出的異常對象){ 異常處理邏輯,異常對象之后,怎么處理異常對象 一般在工作中,會把異常的信息記錄在一個日志中 } ... catch(異常類名 變量名){ }注意: 1.try中可能會拋出多個異常對象,那么就可以使用多個catch來處理這些異常對象 2.如果try中產生了異常,那么就會執行catch中異常處理邏輯,執行完畢catch中處理邏輯, 繼續執行try...catch之后的代碼 如果try中沒有產生異常,那么就不會執行catch中異常的處理邏輯,執行完try中的代碼,繼續執行try...catch之后的代碼 */public class DemoTryCatch {}多異常的捕獲處理
package demo3;import java.util.List;/*多個異常使用捕獲又該如何處理呢?1.多個異常分別處理。2.多個異常一次捕獲,多次處理。3.多個異常一次捕獲,一次處理。*/public class Demo01Exception {}自定義異常類
package demo4;/*自定義異常類: java提供的異常類,不夠我們使用,需要自己定義一些異常類格式: public class xxxException extends Exception | RuntimeException{ 添加一個空參數構造方法 添加一個帶異常信息的構造方法 }注意: 1.自定義異常類一般都是以Exeption結尾,說明該類是一個異常類 2.自定義異常類,必須的繼承Exception或者RuntimeException 繼承Exception:那么自定義的異常類就是一個編譯期異常,如果方法內部拋出了編譯期異常, 就必須處理這個異常,要么throws,要么try...catch 繼承RuntimeException:那么自定義的異常類就是一個運行期異常,無需處理,交給虛擬機處理(中斷處理) */public class RegisterException extends Exception { //添加一個空參數構造方法 public RegisterException(){ super(); } /*添加一個帶異常信息的構造方法查看源碼發現,所有的異常類都會有一個帶異常信息的構造方法,方法內部會調用父類帶異常信息的構造方法,讓父類來處理這個異常信息 */ public RegisterException(String message){ super(message); }}自定義異常類練習
package demo4;import java.util.Scanner;/*要求:我們模擬注冊操作,如果用戶名已存在,則拋出異常并提示:親,該用戶名已被注冊分析: 1.使用數組保存已注冊過的用戶名(數據庫) 2.使用Scanner獲取用戶輸入的注冊用戶名(前端,頁面) 3.定義一個方法,對用戶輸入的注冊名進行判斷 遍歷存儲已注冊過的用戶名數組,獲取每一個用戶名 使用獲取到的用戶名和用戶輸入的用戶名比較 true: 用戶名已存在,拋出RegisterException異常,告知用戶“親,該用戶名已被注冊”; false: 繼續遍歷比較 如果循環線束了,還沒有找到重復的用戶名,提示用戶“恭喜您,注冊成功”; */public class DemoRegisterException { //1.使用數組保存已注冊過的用戶名(數據庫) static String[] usernames = {"聶衛平","古力","常昊"}; public static void main(String[] args) throws RegisterException { //2.使用Scanner獲取用戶輸入的注冊用戶名(前端,頁面) Scanner sc = new Scanner(System.in); System.out.println("請輸入您要注冊的用戶名"); String username = sc.next(); checkUsername(username); } //3.定義一個方法,對用戶輸入的注冊名進行判斷 public static void checkUsername(String username) throws RegisterException { //遍歷存儲已注冊過的用戶名數組,獲取每一個用戶名 for(String name:usernames){ //使用獲取到的用戶名和用戶輸入的用戶名比較 if(name.equals(username)){ //true:用戶名已存在,拋出RegisterException異常,告知用戶“親,該用戶名已被注冊”; throw new RegisterException("親,該用戶名已被注冊"); } } System.out.println("恭喜您,注冊成功"); }}并發與并行
進程概念
線程概念
線程是進程中的一個執行單元,負責當前進行中程序的執行,一個進行中至少有一個線程。一個進程中是可以有多個線程,這個應用程序也可以稱之為多線程程序。
線程調度
分時調度
所有線程輪流使用CPU的使用權,平均分配每個線程占用CPU的時間
搶占式調度
優先讓優先級高的線程使用CPU,如果線程的優先級相同,那么會隨機選擇一個(線程隨機性),Java使用的為搶占式調度。
主線程
package demo4;/*主線程:執行主(main)方法的線程單線程程序:java程序中只有一個線程執行從main方法開始,從上到下依次執行 */public class DemoMainThread { public static void main(String[] args) { Person p1 = new Person("小強"); p1.run(); Person p2 = new Person("旺財"); p2.run(); }}創建多線程程序的第一種方式
package demo4;/*創建多線程程序的第一種方式:創建Thread類的子類java.lang.Thread類:是描述線程的類,我們想要實現多線程程序,就必須繼承Thread類實現步驟: 1.創建一個Thread類的子類 2.在Thread類的子類中重寫Thread類中的run方法,設置線程任務(開啟線程要做什么?) 3.創建Thread類的子類對象 4.調用Thread類中的方法,開啟新的線程,執行run方法 void start() 使該線程開始執行;Java虛擬機調用該線程的run方法。 結果是兩個線程并發地運行;當前線程(main線程)和另一個線程(創建的新線程,執行其run方法) 多次啟動一個線程是非法的。特別是當線程已經結束執行后,不能再重新啟動。java程序屬于搶占式調度,哪個線程優先級高,哪個線程優先執行;同一個優先級,隨機選擇一個執行 */public class Demo01Thread { public static void main(String[] args) { //3.創建Thread類的子類對象 MyThread mt = new MyThread(); //4.調用Thread類中的方法,開啟新的線程,執行run方法 mt.start(); for (int i = 0; i < 20; i++) { System.out.println("main:"+i); } }}package demo4;//1.創建一個Thread類的子類public class MyThread extends Thread { //2.在Thread類的子類中重寫Thread類中的run方法,設置線程任務(開啟線程要做什么?) @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println("run:"+i); } }}總結
以上是生活随笔為你收集整理的c++ raiseexception产生异常_Day17_异常,线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt界面设计器中的界面预览与程序运行时界
- 下一篇: mysql报警代码183_mysql启动