java -- 異常處理、Collection、Iterator迭代器、泛型

来源:https://www.cnblogs.com/paopaoT/archive/2023/04/08/17299041.html
-Advertisement-
Play Games

實現一個簡單的UDP通信程式,僅作為筆記使用 網路編程中有三要素:IP、埠號和通信協議,分別用來確定對方在互聯網上的地址、指定接受數據的軟體和確定數據在網路中傳輸的規則。 IP地址 IP地址分為IPv4地址和IPv6地址,這裡不做討論。 IPv4地址中分為公網地址(萬維網使用)和私有地址(區域網使 ...


異常處理

Java異常處理的五個關鍵字:try、catch、finally、throw、throws

拋出異常throw

在編寫程式時,我們必須要考慮程式出現問題的情況
當調用方法使用接受到的參數時,首先需要先對參數數據進行合法的判斷,數據若不合法,就應該告訴調用者,傳遞合法的數據進來。這時需要使用拋出異常的方式來告訴調用者

// 使用格式
throw new 異常類名(參數);
public static void main(String[] args) {
    int[] arr = {2,4,52,2};
    //根據索引找對應的元素
    int index = 4;
    int element = getElement(arr, index);

    System.out.println(element);
    System.out.println("over");
}
  /*
   * 根據 索引找到數組中對應的元素
   */
public static int getElement(int[] arr,int index){
    //判斷  索引是否越界
    if(index<0 || index>arr.length-1){
        /*
             判斷條件如果滿足,當執行完throw拋出異常對象後,方法已經無法繼續運算
             這時就會結束當前方法的執行,並將異常告知給調用者。這時就需要通過異常來解決
              */
        throw new ArrayIndexOutOfBoundsException("索引越界");
    }
    int element = arr[index];
    return element;
}

而對於調用者來說有兩種方法進行處理:

  • 進行捕獲處理
  • 繼續講問題聲明出去,使用throws聲明處理。

聲明異常throws

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

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

聲明異常格式:

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

聲明異常的代碼演示:

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

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

throws用於進行異常類的聲明,若該方法可能有多種異常情況產生,那麼在throws後面可以寫多個異常類,用逗號隔開。

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();
	}
}

捕獲異常try…catch

如果異常出現的話,會立刻終止程式,所以我們得處理異常:

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

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

捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理。
捕獲異常語法如下:

try{
     編寫可能會出現異常的代碼
}catch(異常類型  e){
     處理異常的代碼
}

演示如下:

public static void main(String[] args) {
	try {// 當產生異常時,必須有處理方式。要麼捕獲,要麼聲明。
	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()
//列印異常的跟蹤棧信息並輸出到控制台

finally 代碼塊

finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程式跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。

// finally不可以單獨使用
// 多用於自身需要處理異常,最終還需要關閉資源時
try{
} catch{
} finally{
}

自定義異常

異常類如何定義:

  1. 自定義一個編譯期異常: 自定義類 並繼承於java.lang.Exception
  2. 自定義一個運行時期的異常類:自定義類 並繼承於java.lang.RuntimeException

練習

// 自定義異常, 當輸入年齡小於0 或 大於200時 拋出異常
class AgeException extends Exception {
    public AgeException() {}
    public AgeException(String message) {
        super(message);
    }
}
class Person {
    int age;
    public void setAge(int age) throws AgeException {
        if (age < 0 || age > 200) {
            throw new AgeException("年齡非法");
        }
        this.age = age;
    }
}
public class customException {
    public static void main(String[] args) throws AgeException {
        Person person = new Person();
        person.setAge(100);
    }
}

Collection集合

集合常用類的繼承體系

image

這張圖是常用的集合,並非只有這些集合

常用方法

  • public boolean add(E e): 把給定的對象添加到當前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把給定的對象在當前集合中刪除。
  • public boolean contains(Object obj): 判斷當前集合中是否包含給定的對象。
  • public boolean isEmpty(): 判斷當前集合是否為空。
  • public int size(): 返回集合中元素的個數。
  • public Object[] toArray(): 把集合中的元素,存儲到數組中
public class Demo {
    public static void main(String[] args) {
        Collection<String> col = new ArrayList<>();
        col.add("張三" );
        col.add("李四");
        col.add("王五");
        System.out.println(col);

        // 刪除指定元素, 刪除成功返回true, 刪除失敗返回false
        boolean b = col.remove("劉六");
        System.out.println(b);
        System.out.println(col);

        // 判斷集合是否包含指定元素
        boolean b2 = col.contains("張三");
        System.out.println(b2);

        // 清空集合中的元素
        // col.clear();
        // System.out.println(col);

        // 判斷當前集合是否為空, 長度為0返回true, 否則返回false
        boolean empty = col.isEmpty();
        System.out.println(empty);

        // 返回集合中元素的個數
        System.out.println(col.size());

        // 將集合轉換為數組並遍歷
        Object[] arr1 = col.toArray();
        for (int i = 0; i < arr1.length; i++) {
            Object obj = arr1[i];
            System.out.println(obj);
        }
        String[] arr2 = col.toArray(new String[col.size()]);
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
    }
}

Iterator

要遍歷Collection集合,除了可以將其轉換為數組,還可以獲取該集合迭代器完成迭代操作

public Iterator iterator()
// 獲取集合對應的迭代器,用來遍歷集合中的元素的
// 迭代:即Collection集合元素的通用獲取方式
// 在取元素之前先要判斷集合中有沒有元素
// 如果有,就把這個元素取出來,繼續判斷,如果還有就再取出來
// 一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。

常用方法

E next()
// 返回迭代的下一個元素。
boolean hasNext()
// 如果仍有元素可以迭代,則返回 true
void remove()
// 刪除當前next指向的元素
Iterator<String> it = col.iterator();
while (it.hasNext()) {
    String next = it.next();
    System.out.println(next);
    if (next.equals("王五")) {
    // 當迭代器在迭代的同時, 集合修改了自身的長度
    // 就會拋出 ConcurrentModificationException 併發修改異常
        // col.add("劉六");
        System.out.println(col);
        // 刪除當前next指向的元素
        it.remove();
    }
}

泛型

/*
    泛型
        定義泛型
            泛型可以定義在 介面/類/方法 上, 將數據類型作為參數傳遞
            泛型介面:
                定義實現類時, 直接確定泛型的數據類型
                定義實現類時, 不確定泛型的數據類型 實現類也是泛型類 創建實現類對象時 確定數據類型
        使用
            創建集合 指定集合中元素的類型, 就是在使用泛型
        好處
            明確集合中元素的數據類型
            將運行時異常提前到編譯時錯誤
            避免強制類型轉換的麻煩
    泛型的通配符
        ?
    泛型的限定
        ? extends 類: 上限限定 只能傳這個類 及其子類類型
        ? extends super 類: 下限限定 只能傳這個類 及其父類類型
*/
public class Demo {
    public static void main(String[] args) {
        // 創建對象時 確定泛型的類型為Integer
        MyClass<Integer> myClass1 = new MyClass<>(12);
        System.out.println(myClass1.getName());

        // 創建對象時 確定泛型的類型為String
        MyClass<String> myClass2 = new MyClass<>("小明");
        System.out.println(myClass2.getName());
        System.out.println("======================");

        // 泛型方法的調用, 調用方法時 確定arg的類型為Integer
        myClass1.method(1,12);
        // 調用方法時 確定arg的類型為String
        myClass1.method(1,"");
        System.out.println("========================");

        new A().method("張三", 16);
        new B<Character, String>().method('四', "18");
        System.out.println("=========================");

        ArrayList<String> stringArrayList = new ArrayList<String>();
        stringArrayList.add("aaa");
        stringArrayList.add("nnn");
        ArrayList<Integer> intArrayList = new ArrayList<Integer>();
        intArrayList.add(1);
        intArrayList.add(2);
        // 定義方法 使兩個集合都可以作為參數傳入並遍歷
        show(stringArrayList);
        show(intArrayList);
        System.out.println("=========================");

	ArrayList<Animal> animals = new ArrayList<>();
        ArrayList<Cat> cats = new ArrayList<>();
        ArrayList<Dog> dogs = new ArrayList<>();
        animals.add(new Animal());
        animals.add(new Animal());
        cats.add(new Cat());
        cats.add(new Cat());
        dogs.add(new Dog());
        dogs.add(new Dog());
        show(dogs);
        show(cats);
        show(animals);
    }
    // 泛型的通配符
    public static void show(ArrayList<?> arrayList){
        // 不能使用?作為變數的數據類型, 所以使用Object
        for (Object obj: arrayList) {
            // 由於是Object類型, 不能調用對應類型的特有方法
            System.out.print(obj + " ");
        }
        System.out.println();
    }
    // 泛型的限定
    public static void show2(ArrayList<? extends Animal> arrayList) {
        for (Object animal : arrayList) {
            Animal animals = (Animal)animal;
            animals.eat();
        }
    }
}

// 定義泛型類
class MyClass<A> {
    private A name;
    public MyClass(A name) {
        this.name = name;
    }
    public A getName() {
        return name;
    }
    // 定義泛型方法
    public <arg>void method(A attribute, arg arg) {
        System.out.println(attribute.getClass());
        System.out.println(arg.getClass().getSimpleName());
    }
}
// 定義反應介面
interface MyInterface<k,v> {
    public abstract void method(k key, v value);
}
// 定義實現類並確定泛型的數據類型
class A implements MyInterface<String, Integer> {
    @Override
    public void method(String key, Integer value) {
        System.out.println(key + ": " + value);
    }
}
// 定義實現類(泛型類) 但不確定泛型的數據類型 創建對象時 確定數據類型
class B<k, v> implements MyInterface<k, v> {
    @Override
    public void method(k key, v value) {
        System.out.println(key + ": " + value);
    }
}
class Animal{
    public void eat(){
        System.out.println("動物吃了");
    }
}
class Cat extends Animal {
    public void eat(){
        System.out.println("吃魚");
    }
}
class Dog extends Animal {
    public void eat(){
        System.out.println("吃肉");
    }
}

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

-Advertisement-
Play Games
更多相關文章
  • 鎖屏面試題百日百刷,每個工作日堅持更新面試題。請看到最後就能獲取你想要的,接下來的是今日的面試題: 1.HBase內部機制是什麼? Hbase是一個能適應聯機業務的資料庫系統 物理存儲:hbase的持久化數據是將數據存儲在HDFS上。 存儲管理:一個表是劃分為很多region的,這些region分佈 ...
  • 1. 精靈圖 1.1 為什麼需要精靈圖 一個網頁中往往會應用很多小的背景圖像作為修飾,當網頁中的圖像過多時,伺服器就會頻繁地接收和發送請求圖片,造成伺服器請求壓力過大,這將大大降低頁面的載入速度。 因此,為了有效地減少伺服器接受和發送請求的次數,提高頁面的載入速度,出現了CSS精靈技術。 核心原理: ...
  • 今年是23年,互聯網大裁員,電腦行業的小伙伴也深有體會,那麼還沒有入行的我們要怎麼去選擇編程語言?一文簡單帶你分析你應該值得去學什麼 原文地址,未來會持續更新Python面試題、前後端分離項目,點擊鏈接前往 結論 值得去學Python,不管是作為第一編程語言還是第二編程語言,你都應該要學習Pyth ...
  • 效果 搭建一個spring源碼調試環境,創建一個spring-demo模塊,寫一些測試代碼。 給源碼添加註釋。 給源碼打包 ubantu環境下搭建spring6.0.x源碼環境 步驟 源碼網址 Spring Framework 下載代碼 fork到自己的GitHub倉庫,然後拉代碼 git clon ...
  • 簡介 本文給大家推薦博主自己開源的電商項目newbee-mall-pro。在newbee-mall項目的基礎上搭建而來, 使用 mybatis-plus 作為 orm 層框架,並添加了一系列高級功能以及代碼優化,特性如下: 商城首頁 【為你推薦】 欄目添加協同過濾演算法。按照 UserCF 基於用戶的 ...
  • 操作系統 :CentOS 7.6_x64 freeswitch版本 :1.10.9 sofia-sip版本: sofia-sip-1.13.14 freeswitch使用sip協議進行通信,當sip消息超過mtu時,會出現拆包的情況,這裡整理下sip消息拆包原理及組包流程。 一、拆包的原理 簡單來說 ...
  • 函數式語言特性:-迭代器和閉包 本章內容 閉包(closures) 迭代器(iterators) 優化改善 12 章的實例項目 討論閉包和迭代器的運行時性能 一、閉包(1)- 使用閉包創建抽象行為 什麼是閉包(closure) 閉包:可以捕獲其所在環境的匿名函數。 閉包: 是匿名函數 保存為變數、作 ...
  • 承接上文 承接上一篇文章【演算法數據結構專題】「延時隊列演算法」史上手把手教你針對層級時間輪(TimingWheel)實現延時隊列的開發實戰落地(上)】我們基本上對層級時間輪演算法的基本原理有了一定的認識,本章節就從落地的角度進行分析和介紹如何通過Java進行實現一個屬於我們自己的時間輪服務組件,最後,在 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...