Java異常、泛型與集合框架實戰:從基礎到應用

? 在Java編程的世界里,異常處理、泛型和集合框架是構建高效、健壯應用的關鍵技術。通過掌握這些技術,我們可以更好地管理程序運行時的錯誤,提高代碼的復用性和類型安全性。今天,我將通過一系列實驗,分享如何在Java中使用異常處理、泛型和集合框架來解決實際問題。

實驗背景

? Java異常處理機制允許我們優雅地處理程序運行時的錯誤,泛型提供了類型安全的集合操作,而集合框架則為我們提供了豐富的數據結構來存儲和管理數據。本次實驗的目標是通過一系列實例,掌握Java異常處理、泛型和集合框架的基本使用方法。

實驗設計

1. 驗證部分:異常處理

異常處理基礎

異常處理是Java中用于處理運行時錯誤的機制。以下是一個簡單的異常處理示例,展示如何捕獲和處理常見的異常:

public class TestExcept {public static void main(String[] args) {try {int x = 100 / 0; // ArithmeticException} catch (Exception e) {e.printStackTrace();}int[] a = new int[5];try {a[8] = 111; // ArrayIndexOutOfBoundsException} catch (Exception e) {e.printStackTrace();}int[] b = null;try {b[0] = 222; // NullPointerException} catch (Exception e) {e.printStackTrace();}Object str = "12345";try {int num = (int) str; // ClassCastException} catch (Exception e) {e.printStackTrace();}String x = "1111a";try {int n = Integer.parseInt(x); // NumberFormatException} catch (Exception e) {e.printStackTrace();}}
}


?

自定義異常

自定義異常類允許我們創建具有特定行為的異常。以下是一個自定義異常類的示例:

class MyExcept extends Exception {MyExcept(String info) {super(info);}
}class MyFun {void doWork(boolean isExcept) throws MyExcept {System.out.println("doWork@MyFun0");if (isExcept)throw new MyExcept("出現異常!");}
}public class TestMyExcept {public static void main(String[] args) {MyFun mf = new MyFun();try {System.out.println("開始處理...");mf.doWork(true);} catch (MyExcept e) {e.printStackTrace();System.out.println("完成異常處理!");} finally {System.out.println("完成收尾處理。");}System.out.println("結束處理。");}
}

輸出結果:

2. 驗證部分:泛型與集合框架

泛型基礎

泛型提供了類型安全的集合操作。以下是一個使用泛型的示例:

class A {public String toString() {return "A";}
}class B extends A {public String toString() {return "B";}
}class C extends B {public String toString() {return "C";}
}class MyTest<E, F> {E x;F y;MyTest(E x, F y) {this.x = x;this.y = y;}void show() {System.out.println("結果:x=" + x + "; y=" + y);}
}public class GenericClass {static void checkMyTest1(MyTest<?, ?> test) {System.out.print("測試->");test.show();}static void checkMyTest2(MyTest<? super B, ? extends B> test) {System.out.print("測試->");test.show();}public static void main(String[] args) {MyTest<String, Double> test1 = new MyTest<>("Hello!", 111.0);test1.show();MyTest<A, C> test2 = new MyTest<>(new A(), new C());test2.show();checkMyTest1(test1);checkMyTest1(test2);checkMyTest2(test2);}
}

輸出結果:

集合框架基礎

集合框架提供了豐富的數據結構來存儲和管理數據。以下是一個使用集合框架的示例:

import java.util.*;class Apple {int id;double price;Apple(int id, double price) {this.id = id;this.price = price;}public String toString() {return "apple id=" + id + "; price=" + price;}
}public class TestQueue1 {public static void main(String[] args) {Deque<Apple> queue = new ArrayDeque<>();queue.add(new Apple(6, 4.3));queue.add(new Apple(11, 5.5));queue.add(new Apple(6, 8.2));queue.addFirst(new Apple(23, 7.3));queue.removeLast();queue.add(new Apple(6, 9.6));System.out.println("隊列長度:" + queue.size());for (Apple a : queue)System.out.println(a);System.out.println("------------------");queue.pollLast();while (!queue.isEmpty())System.out.println(queue.poll());}
}

輸出結果:

3. 設計部分:綜合應用

自定義異常處理

以下是一個自定義異常處理的示例,展示如何創建和使用自定義異常類:

class MyException extends Exception {String message;public MyException(int m) {message = "溫度為" + m + "度,已超出范圍!";}public String toString() {return message;}
}class DataInput {public void check(int m) throws MyException {if (m > 500 || m < 100) {throw new MyException(m);} else {System.out.println("合理的溫度范圍。");}}
}public class TestTemperature {public static void main(String[] args) {DataInput p = new DataInput();try {p.check(1400);} catch (MyException e) {System.out.println(e.toString());}}
}

集合框架應用

以下是一個使用集合框架的示例,展示如何管理圖書信息:

import java.util.*;class Book {private String isbn;private String title;private String author;private double price;public Book(String isbn, String title, String author, double price) {this.isbn = isbn;this.title = title;this.author = author;this.price = price;}public String getIsbn() {return isbn;}public String getTitle() {return title;}public String getAuthor() {return author;}public double getPrice() {return price;}
}class BookList {private LinkedList<Book> list = new LinkedList<>();public void addBook(Book book) {list.add(book);}public void deleteBook(String isbn) {list.removeIf(book -> book.getIsbn().equals(isbn));}public Book findBookByIsbn(String isbn) {for (Book book : list) {if (book.getIsbn().equals(isbn)) {return book;}}return null;}public void updateBook(String isbn, Book newBook) {for (ListIterator<Book> it = list.listIterator(); it.hasNext();) {Book book = it.next();if (book.getIsbn().equals(isbn)) {it.set(newBook);break;}}}public Book findMostExpensiveBook() {double maxPrice = Double.MIN_VALUE;Book mostExpensiveBook = null;for (Book book : list) {if (book.getPrice() > maxPrice) {maxPrice = book.getPrice();mostExpensiveBook = book;}}return mostExpensiveBook;}
}public class TestBookStore {public static void main(String[] args) {BookList list = new BookList();list.addBook(new Book("9999", "aa", "nnn", 23.5));}
}

泛型與集合框架綜合應用

以下是一個使用泛型和集合框架的示例,展示如何管理商品信息:

import java.util.TreeSet;
import java.util.Comparator;class Product implements Comparable<Product> {private String name;private double price;public Product(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic int compareTo(Product other) {return Double.compare(other.price, this.price);}@Overridepublic String toString() {return "Product{" +"name='" + name + '\'' +", price=" + price +'}';}
}public class ProductStore {private TreeSet<Product> products;public ProductStore() {this.products = new TreeSet<>();}public ProductStore(Comparator<? super Product> comparator) {this.products = new TreeSet<>(comparator);}public void addProduct(Product product) {products.add(product);}public void deleteProduct(Product product) {products.remove(product);}public void modifyProduct(Product oldProduct, Product newProduct) {products.remove(oldProduct);products.add(newProduct);}public void printProducts() {System.out.println("Product List:");for (Product product : products) {System.out.println(product);}}public static void main(String[] args) {ProductStore store = new ProductStore();store.addProduct(new Product("Laptop", 2000.0));store.addProduct(new Product("Smartphone", 1000.0));store.addProduct(new Product("Tablet", 1500.0));store.addProduct(new Product("Smartphone111", 1000.0));store.addProduct(new Product("Smartphone222", 1002.0));store.printProducts();Product laptop = new Product("Laptop", 1800.0);store.modifyProduct(new Product("Laptop", 2000.0), laptop);store.printProducts();store.deleteProduct(new Product("xxxx", 1000.0));store.printProducts();System.out.println("--------------------");ProductStore storeWithComparator = new ProductStore(new Comparator<Product>() {@Overridepublic int compare(Product o1, Product o2) {return Double.compare(o2.getPrice(), o1.getPrice());}});storeWithComparator.addProduct(new Product("Accessory", 50.0));storeWithComparator.addProduct(new Product("Headphones", 200.0));storeWithComparator.printProducts();}
}

輸出結果:


單詞計數器

以下是一個使用集合框架的示例,展示如何統計單詞出現的次數:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class WordCounter {private Map<String, Integer> wordCounts;private Scanner scanner;public WordCounter() {wordCounts = new HashMap<>();scanner = new Scanner(System.in);}public void addWord(String word) {if (wordCounts.containsKey(word)) {wordCounts.put(word, wordCounts.get(word) + 1);} else {wordCounts.put(word, 1);}}public void printWordCounts() {for (Map.Entry<String, Integer> entry : wordCounts.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}public static void main(String[] args) {WordCounter counter = new WordCounter();System.out.println("請輸入單詞(輸入'EXIT'結束):");String input;while (!(input = counter.scanner.nextLine()).equalsIgnoreCase("EXIT")) {counter.addWord(input);counter.printWordCounts();}counter.scanner.close();}
}

輸出結果:

實驗使用環境

- 開發工具:IntelliJ IDEA
- 運行環境:Java SE Development Kit (JDK)

實驗小結

? 在本次實驗中,我遇到了一些挑戰,尤其是在處理自定義異常和泛型時。通過不斷調試和查閱文檔,我學會了如何正確處理異常,并在代碼中添加適當的異常處理邏輯。同時,我也對泛型的類型擦除機制有了更深入的理解。

? 通過這次實驗,我不僅掌握了Java異常處理、泛型和集合框架的基本操作,還學會了如何在實際應用中使用這些技術。這些技能為我未來開發更復雜的應用程序打下了堅實的基礎。同時,我也認識到了在編程中細節處理的重要性,一個小的疏忽可能會導致程序無法正常運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80294.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring源碼之解決循環依賴 三級緩存

目錄 三級緩存核心原理 循環依賴的解決過程 1. Bean A創建過程中提前曝光工廠 2. Bean B創建時發現依賴A&#xff0c;從緩存獲取 3. Bean A繼續完成初始化 三級緩存的作用總結 二級緩存為何不夠解決緩存依賴&#xff1f; 三級緩存如何解決&#xff1f; 為什么不直接在…

K8S Ingress 實現AB測試、藍綠發布、金絲雀(灰度)發布

假設有如下三個節點的 K8S 集群&#xff1a; ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、場景分析 閱讀本文&#xff0c;默認您已經安裝了 Ingress Nginx。 1&#xff09;A/B 測試 A/B 測試基于用戶請求的元信息將流量路由…

深入理解構造函數,析構函數

目錄 1.引言 2.構造函數 1.概念 2.特性 3.析構函數 1.概念 2.特性 1.引言 如果一個類中什么都沒有&#xff0c;叫作空類. class A {}; 那么我們這個類中真的是什么都沒有嗎?其實不是,如果我們類當中上面都不寫.編譯器會生成6個默認的成員函數。 默認成員函數:用戶沒有顯…

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接 1 說明2 客戶端配置jdk環境3服務器檢查oracle數據庫補丁4設置ssla 服務器配置walletb 上傳測試腳本和配置文件到客戶端c 服務器修改數據庫偵聽和sqlnet.orad 修改客戶端的sqlnet.ora和tnsnames.ora的連接符e 修改java代碼的數據連接…

BrepGen中的幾何特征組裝與文件保存詳解 deepwiki occwl OCC包裝庫

有這種好東西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 組裝幾何特征以創建B-rep模型 保存為STEP和STL文件細說 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重慶 ICPC 比賽游記

2025.5.9 比賽前一天晚上&#xff0c;激動地睡不著覺&#xff0c;起來收拾了好多東西。&#xff08;其實就四本書&#xff0c;剩下的全是零食……關鍵在于這四本書基本沒用。&#xff09; 2025.5.10 學校喪心病狂的讓我們 6:20 到校門口集合坐車&#xff08;據說是怕趕不上比…

0x08.Redis 支持事務嗎?如何實現?

回答重點 Redis 支持事務,但它的事務與 MySQL 等關系型數據庫的事務有著本質區別。MySQL 中的事務嚴格遵循 ACID 特性,而 Redis 中的事務主要保證的是命令執行的原子性和隔離性,即所有命令在一個不可分割的操作中順序執行,不會被其他客戶端的命令請求所打斷。 最關鍵的區…

佰力博科技與您探討表面電阻的測試方法及應用領域

表面電阻測試是一種用于測量材料表面電阻值的技術&#xff0c;廣泛應用于評估材料的導電性能、靜電防護性能以及絕緣性能。 1、表面電阻的測試測試方法&#xff1a; 表面電阻測試通常采用平行電極法、同心圓電極法和四探針法等方法進行。其中&#xff0c;平行電極法通過在試樣…

數據庫的規范化設計方法---3種范式

第一范式&#xff08;1NF&#xff09;&#xff1a;確保表中的每個字段都是不可分割的基本數據項。 第二范式&#xff08;2NF&#xff09;&#xff1a;在滿足1NF的基礎上&#xff0c;確保非主屬性完全依賴于主鍵。 第三范式&#xff08;3NF&#xff09;&#xff1a;在滿足2NF的基…

產品經理入門(2)產品體驗報告

產品體驗報告大綱&#xff1a;重點在產品體驗——優點。 1.產品概括 可以從各大平臺搜產品介紹。 2.市場分析 按照產品方向分析各個指標——包括有效使用時間,市場規模等。 3. 用戶分析——對用戶通過各項指標畫像。 4.產品體驗——對各項功能與設計的體驗。 5.報告總結

[Java][Leetcode simple] 13. 羅馬數字轉整數

一、自己想的 只有提到的六種情況是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虛擬機上配置靜態 IP 地址并保持重啟后 SSH 連接

在使用 CentOS 7 的虛擬機時&#xff0c;我們通常需要配置靜態 IP 地址&#xff0c;以確保在每次虛擬機重啟后能夠通過 SSH 連接。本文將介紹如何在 CentOS 7 系統中配置靜態 IP 地址&#xff0c;并確保配置在系統重啟后依然生效。 步驟 1&#xff1a;檢查虛擬機網絡接口 首先…

matlab求解問題

一、目的 掌握Matlab中函數求導、函數極值和極限問題的求解,能夠借助Matlab工具對簡單優化模型進行求解。 二、內容與設計思想 1、函數求導 1.1求解給定函數的一階導數&#xff1a;diff(y, x)用于對變量x求y的導數。 1.2求解給定函數的二階導數&#xff1a;在求出一階導數的…

C語言斐波那契數列

斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列 、兔子數列。由意大利數學家萊昂納多?斐波那契在 1202 年提出&#xff0c;源于其《算盤書》中一道兔子繁殖問題。定義&#xff1a;在數學上&#xff0c;該數列以遞歸形式定義。最常見的是…

AI浪潮:開啟科技新紀元

AI 的多面應用? AI 的影響力早已突破實驗室的圍墻&#xff0c;在眾多領域落地生根&#xff0c;成為推動行業變革的重要力量。 在醫療領域&#xff0c;AI 宛如一位不知疲倦的助手&#xff0c;助力醫生提升診療效率與準確性。通過對海量醫學影像的深度學習&#xff0c;AI 能夠快…

Ansys 計算剛柔耦合矩陣系數

Ansys 計算剛柔耦合系數矩陣 文章目錄 Ansys 計算剛柔耦合系數矩陣衛星的剛柔耦合動力學模型采用 ANSYS 的 APDL 語言的計算方法系統轉動慣量的求解方法參考文獻 衛星的剛柔耦合動力學模型 柔性航天器的剛柔耦合動力學模型可以表示為 m v ˙ B t r a n η F J ω ˙ ω J…

算法題(148):排座椅

審題&#xff1a; 本題需要我們找到最佳的排座椅方案&#xff0c;并輸出行&#xff0c;列方案 思路&#xff1a; 方法一&#xff1a;簡單貪心 由于題目會告訴我們有哪幾對的同學會交頭接耳&#xff0c;所以我們可以記錄下第幾行/第幾列上可以隔開的同學對數&#xff0c;而題目限…

企業級電商數據對接:1688 商品詳情 API 接口開發與優化實踐

在數字化浪潮席卷全球的當下&#xff0c;企業級電商平臺之間的數據對接已成為提升運營效率、增強市場競爭力的關鍵環節。作為國內知名的 B2B 電商平臺&#xff0c;1688 擁有海量商品資源&#xff0c;通過開發和優化商品詳情 API 接口&#xff0c;企業能夠快速獲取商品信息&…

【Cesium入門教程】第七課:Primitive圖元

Cesium豐富的空間數據可視化API分為兩部分&#xff1a;primitive API面向三維圖形開發者&#xff0c;更底層一些。 Entity API是數據驅動更高級一些。 // entity // 調用方便&#xff0c;封裝完美 // 是基于primitive的封裝// primitive // 更接近底層 // 可以繪制高級圖形 /…

Oracle APEX 必須輸入項目標簽型號顯示位置

1. 正常Oracle APEX中必須輸入項目標簽的紅星顯示在標簽文字左側&#xff0c;偏偏項目要求顯示在右側&#xff0c; 加入如下全局CSS代碼 .t-Form-label {display: flex;flex-direction: row-reverse;gap: 1px; }以上。