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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...