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.mzph.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; }以上。