IO(異常處理)

来源:https://www.cnblogs.com/ztg-java-xuexi/archive/2022/03/29/16072728.html
-Advertisement-
Play Games

程式的異常:Throwable * 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說記憶體溢出。 * 問題:Exception * A:編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。 * B:運行期問題:RuntimeExcep ...


程式的異常:Throwable
* 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說記憶體溢出。
* 問題:Exception
*       A:編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。
*       B:運行期問題:RuntimeException 這種問題我們也不處理,因為是你的問題,而且這個問題出現肯定是我們的代碼不夠嚴謹,需要修正代碼的。
*
* 如何程式出現了問題,我們沒有做任何處理,最終jvm會做出預設的處理。
* 把異常的名稱,原因及出現的問題等信息輸出在控制台。
* 同時會結束程式。

異常處理一

package cn.itcast_02;

/*
 * A:一個異常
 * B:二個異常的處理
 *         a:每一個寫一個try...catch
 *         b:寫一個try,多個catch
 *             try{
 *                 ...
 *             }catch(異常類名 變數名) {
 *                 ...
 *             }
 *             catch(異常類名 變數名) {
 *                 ...
 *             }
 *             ...
 * 
 *             註意事項:
 *                 1:能明確的儘量明確,不要用大的來處理。
 *                 2:平級關係的異常誰前誰後無所謂,如果出現了子父關係,父必須在後面。
 * 
 * 註意:
 *         一旦try裡面出了問題,就會在這裡把問題給拋出去,然後和catch裡面的問題進行匹配,
 *         一旦有匹配的,就執行catch裡面的處理,然後結束了try...catch
 *         繼續執行後面的語句。
 */
public class ExceptionDemo2 {
    public static void main(String[] args) {
        // method1();

        // method2();

        // method3();

        method4();
    }

    public static void method4() {
        int a = 10;
        int b = 0;
        int[] arr = { 1, 2, 3 };

        // 爺爺在最後
        try {
            System.out.println(a / b);
            System.out.println(arr[3]);
            System.out.println("這裡出現了一個異常,你不太清楚是誰,該怎麼辦呢?");
        } catch (ArithmeticException e) {
            System.out.println("除數不能為0");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你訪問了不該的訪問的索引");
        } catch (Exception e) {
            System.out.println("出問題了");
        }

        // 爺爺在前面是不可以的
        // try {
        // System.out.println(a / b);
        // System.out.println(arr[3]);
        // System.out.println("這裡出現了一個異常,你不太清楚是誰,該怎麼辦呢?");
        // } catch (Exception e) {
        // System.out.println("出問題了");
        // } catch (ArithmeticException e) {
        // System.out.println("除數不能為0");
        // } catch (ArrayIndexOutOfBoundsException e) {
        // System.out.println("你訪問了不該的訪問的索引");
        // }

        System.out.println("over");
    }

    // 兩個異常的處理
    public static void method3() {
        int a = 10;
        int b = 0;
        int[] arr = { 1, 2, 3 };

        try {
            System.out.println(arr[3]);
            System.out.println(a / b);
            // System.out.println(arr[3]);
        } catch (ArithmeticException e) {
            System.out.println("除數不能為0");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你訪問了不該的訪問的索引");
        }

        System.out.println("over");
    }

    // 兩個異常
    public static void method2() {
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);
        } catch (ArithmeticException e) {
            System.out.println("除數不能為0");
        }

        int[] arr = { 1, 2, 3 };
        try {
            System.out.println(arr[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你訪問了不該的訪問的索引");
        }

        System.out.println("over");
    }

    // 一個異常
    public static void method1() {
        // 第一階段
        int a = 10;
        // int b = 2;
        int b = 0;

        try {
            System.out.println(a / b);
        } catch (ArithmeticException ae) {
            System.out.println("除數不能為0");
        }

        // 第二階段
        System.out.println("over");
    }
}

異常處理二(JDK7新特性)

package cn.itcast_02;

/*
 * JDK7出現了一個新的異常處理方案:
 *         try{
 * 
 *         }catch(異常名1 | 異常名2 | ...  變數 ) {
 *             ...
 *         }
 * 
 *         註意:這個方法雖然簡潔,但是也不夠好。
 *             A:處理方式是一致的。(實際開發中,好多時候可能就是針對同類型的問題,給出同一個處理)
 *            B:多個異常間必須是平級關係。
 */
public class ExceptionDemo3 {
    public static void main(String[] args) {
        method();
    }

    public static void method() {
        int a = 10;
        int b = 0;
        int[] arr = { 1, 2, 3 };

        // try {
        // System.out.println(a / b);
        // System.out.println(arr[3]);
        // System.out.println("這裡出現了一個異常,你不太清楚是誰,該怎麼辦呢?");
        // } catch (ArithmeticException e) {
        // System.out.println("除數不能為0");
        // } catch (ArrayIndexOutOfBoundsException e) {
        // System.out.println("你訪問了不該的訪問的索引");
        // } catch (Exception e) {
        // System.out.println("出問題了");
        // }

        // JDK7的處理方案
        try {
            System.out.println(a / b);
            System.out.println(arr[3]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("出問題了");
        }

        System.out.println("over");
    }

}

/*
* 編譯時異常和運行時異常的區別
* 編譯期異常:Java程式必須顯示處理,否則程式就會發生錯誤,無法通過編譯
* 運行期異常:無需顯示處理,也可以和編譯時異常一樣處理
*/

package cn.itcast_03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 編譯時異常和運行時異常的區別
 * 編譯期異常:Java程式必須顯示處理,否則程式就會發生錯誤,無法通過編譯
 * 運行期異常:無需顯示處理,也可以和編譯時異常一樣處理
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        // int a = 10;
        // int b = 0;
        // if (b != 0) {
        // System.out.println(a / b);
        // }

        String s = "2014-11-20";
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // Date d = sdf.parse(s);
        try {
            Date d = sdf.parse(s);
            System.out.println(d);
        } catch (ParseException e) {
            // e.printStackTrace();
            System.out.println("解析日期出問題了");
        }
    }
}

 Throwable的幾個常見方法

在try裡面發現問題後,jvm會幫我們生成一個異常對象,然後把這個對象拋出,和catch裡面的類進行匹配。
* 如果該對象是某個類型的,就會執行該catch裡面的處理信息。
*
* 異常中要瞭解的幾個方法:
* public String getMessage():異常的消息字元串
* public String toString():返回異常的簡單信息描述
* 此對象的類的 name(全路徑名)
* ": "(冒號和一個空格)
* 調用此對象 getLocalizedMessage()方法的結果 (預設返回的是getMessage()的內容)
* printStackTrace() 獲取異常類名和異常信息,以及異常出現在程式中的位置。返回值void。把信息輸出在控制台。

package cn.itcast_04;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 在try裡面發現問題後,jvm會幫我們生成一個異常對象,然後把這個對象拋出,和catch裡面的類進行匹配。
 * 如果該對象是某個類型的,就會執行該catch裡面的處理信息。
 * 
 * 異常中要瞭解的幾個方法:
 * public String getMessage():異常的消息字元串        
 * public String toString():返回異常的簡單信息描述
 *         此對象的類的 name(全路徑名)
 *         ": "(冒號和一個空格) 
 *         調用此對象 getLocalizedMessage()方法的結果 (預設返回的是getMessage()的內容)
 * printStackTrace() 獲取異常類名和異常信息,以及異常出現在程式中的位置。返回值void。把信息輸出在控制台。
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        String s = "2014-11-20";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date d = sdf.parse(s); // 創建了一個ParseException對象,然後拋出去,和catch裡面進行匹配
            System.out.println(d);
        } catch (ParseException e) { // ParseException e = new ParseException();
            // ParseException
            // e.printStackTrace();

            // getMessage()
            // System.out.println(e.getMessage());
            // Unparseable date: "2014-11-20"

            // toString()
            // System.out.println(e.toString());
            // java.text.ParseException: Unparseable date: "2014-11-20"
            
            e.printStackTrace();
            //跳轉到某個指定的頁面(index.html)
        }
        
        System.out.println("over");
    }
}

 throws的方式處理異常

/*
* 有些時候,我們是可以對異常進行處理的,但是又有些時候,我們根本就沒有許可權去處理某個異常。
* 或者說,我處理不了,我就不處理了。
* 為瞭解決出錯問題,Java針對這種情況,就提供了另一種處理方案:拋出。
*
* 格式:
* throws 異常類名
* 註意:這個格式必須跟在方法的括弧後面。
*
* 註意:
* 儘量不要在main方法上拋出異常。
* 但是我講課為了方便我就這樣做了。
*
* 小結:
* 編譯期異常拋出,將來調用者必須處理。
* 運行期異常拋出,將來調用可以不用處理。

package cn.itcast_05;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 有些時候,我們是可以對異常進行處理的,但是又有些時候,我們根本就沒有許可權去處理某個異常。
 * 或者說,我處理不了,我就不處理了。
 * 為瞭解決出錯問題,Java針對這種情況,就提供了另一種處理方案:拋出。
 * 
 * 格式:
 *         throws 異常類名
 *         註意:這個格式必須跟在方法的括弧後面。
 * 
 * 註意:
 *         儘量不要在main方法上拋出異常。
 *         但是我講課為了方便我就這樣做了。
 * 
 * 小結:
 *         編譯期異常拋出,將來調用者必須處理。
 *         運行期異常拋出,將來調用可以不用處理。
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("今天天氣很好");
        try {
            method();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("但是就是不該有霧霾");

        method2();
    }

    // 運行期異常的拋出
    public static void method2() throws ArithmeticException {
        int a = 10;
        int b = 0;
        System.out.println(a / b);
    }

    // 編譯期異常的拋出
    // 在方法聲明上拋出,是為了告訴調用者,你註意了,我有問題。
    public static void method() throws ParseException {
        String s = "2014-11-20";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(s);
        System.out.println(d);
    }
}

 

throw異常處理

throw:如果出現了異常情況,我們可以把該異常拋出,這個時候的拋出的應該是異常的對象。
*
* throws和throw的區別(面試題)
throws
         用在方法聲明後面,跟的是異常類名
        可以跟多個異常類名,用逗號隔開
       表示拋出異常,由該方法的調用者來處理
throws表示出現異常的一種可能性,並不一定會發生這些異常
throw
        用在方法體內,跟的是異常對象名
        只能拋出一個異常對象名
       表示拋出異常,由方法體內的語句處理
      throw則是拋出了異常,執行throw則一定拋出了某種異常

package cn.itcast_06;

/*
 * throw:如果出現了異常情況,我們可以把該異常拋出,這個時候的拋出的應該是異常的對象。
 * 
 * throws和throw的區別(面試題)
    throws
        用在方法聲明後面,跟的是異常類名
        可以跟多個異常類名,用逗號隔開
        表示拋出異常,由該方法的調用者來處理
        throws表示出現異常的一種可能性,並不一定會發生這些異常
    throw
        用在方法體內,跟的是異常對象名
        只能拋出一個異常對象名
        表示拋出異常,由方法體內的語句處理
        throw則是拋出了異常,執行throw則一定拋出了某種異常
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        // method();
        
        try {
            method2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void method() {
        int a = 10;
        int b = 0;
        if (b == 0) {
            throw new ArithmeticException();
        } else {
            System.out.println(a / b);
        }
    }

    public static void method2() throws Exception {
        int a = 10;
        int b = 0;
        if (b == 0) {
            throw new Exception();
        } else {
            System.out.println(a / b);
        }
    }
}

 

 如何異常處理

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 圖論 圖論是數學的一個分支。它以圖為研究對象。圖論中的圖是由若幹給定的點及連接兩點的線所構成的圖形,這種圖形通常用來描述某些事物之間的某種特定關係,用點代表事物,用連接兩點的線表示相應兩個事物間具有這種關係。 樹 樹是一種數據結構,它是由n(n≥1)個有限節點組成一個具有層次關係的集合。把它叫做“樹 ...
  • 任務要求 把棋盤當作一個稀疏矩陣,0表示沒棋,1表示黑棋,2表示藍棋。 把該稀疏矩陣壓縮以三元組形式表示並以文件形式保存,再寫另一個程式讀取文件中的信息把壓縮後的三元組還原成原來的稀疏矩陣。 其中三元組的第一行用來存儲原始稀疏矩陣的行數、列數和有效的數據個數,其餘行用來存儲有效的非0數據 思路分析 ...
  • 前言 開發環境 python 3.8pycharm 2021.2 專業版 代碼實現 發送請求 獲取數據 解析數據(篩選數據) 保存數據 連接資料庫 對於本篇文章有疑問的同學可以加【資料白嫖、解答交流群:910981974】 開始代碼 請求數據 # 偽裝 headers = { 'cookie': ' ...
  • 一個簡單的Java程式 // HelloJava.java public class HelloJava { public static void main(String[] args) { System.out.println("Hello Java!"); } } Java是區分大小寫的 關鍵字 ...
  • finally的特點 finally:被finally控制的語句體一定會執行 * 註意:如果在執行到finally之前jvm退出了,就不能執行了。 * * A:格式 * try...catch...finally... * B:用於釋放資源,在IO流操作和資料庫操作中會見到 package cn.i ...
  • 練習: 存儲學生對象並遍歷,創建TreeSet集合使用無參構造方法,並按照年齡從小到大的順序排序,若年齡相同再按照姓名的字母順序排序 分析: 1.創建學生類,成員變數name,age;無參構造,帶參構造;get\set方法; 2.創建測試類,添加數據併進行排序;直接排序會報錯 3.需要Student ...
  • 過濾器就是過濾條件,對已經定位到數組中的 DOM 對象進行過濾篩選,過濾條件不能獨立出現在 jquery 函數,如果使用只能出現在選擇器後方 ...
  • 背景 很多時候,我們項目在開發環境和生成環境的環境配置是不一樣的,例如,資料庫配置,在開發的時候,我們一般用測試資料庫,而在生產環境的時候,我們是用正式的數據,這時候,我們可以利用profile在不同的環境下配置用不同的配置文件或者不同的配置。 解決方案 spring boot允許你通過命名約定按照 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...