2026/4/18 10:59:58
网站建设
项目流程
如何编写网站建设方案书,lnmp wordpress 后台没有主题,网站卖给做网站的,不用写代码做网站软件Java高级特性#xff1a;异常处理与集合框架 4.1 异常处理
4.1.1 学习目标与重点提示
学习目标#xff1a;理解异常的概念#xff0c;掌握异常的处理方法#xff08;try-catch-finally、throw、throws#xff09;#xff0c;了解常见的异常类型。 重点#xff1a;try-…Java高级特性异常处理与集合框架4.1 异常处理4.1.1 学习目标与重点提示学习目标理解异常的概念掌握异常的处理方法try-catch-finally、throw、throws了解常见的异常类型。重点try-catch-finally的执行流程、自定义异常的实现。4.1.2 异常的概念在程序运行过程中可能会出现各种错误如文件不存在、数组下标越界、除数为零等。这些错误会导致程序无法正常运行甚至崩溃。Java将这些错误分为两类错误Error和异常Exception。错误Error是程序无法处理的严重错误如内存溢出、线程死锁等。这些错误通常由Java虚拟机JVM抛出程序无法通过代码处理。异常Exception是程序可以处理的错误如文件未找到、数组下标越界、除数为零等。这些异常通常由程序抛出可以通过代码进行处理。异常类的继承关系Throwable根类 ├─ Error错误 │ ├─ VirtualMachineError虚拟机错误 │ │ ├─ OutOfMemoryError内存溢出错误 │ │ └─ StackOverflowError栈溢出错误 │ └─ AWTErrorAWT错误 └─ Exception异常 ├─ RuntimeException运行时异常 │ ├─ NullPointerException空指针异常 │ ├─ ArrayIndexOutOfBoundsException数组下标越界异常 │ ├─ ArithmeticException算术异常如除数为零 │ └─ ClassCastException类转换异常 └─ CheckedException受检异常 ├─ IOException输入输出异常 │ ├─ FileNotFoundException文件未找到异常 │ └─ EOFException文件结束异常 └─ SQLException数据库异常运行时异常与受检异常的区别运行时异常RuntimeException编译时不检查程序运行时可能抛出。例如NullPointerException、ArrayIndexOutOfBoundsException等。受检异常CheckedException编译时必须处理否则会导致编译错误。例如FileNotFoundException、SQLException等。4.1.3 异常的处理方法Java提供了多种异常处理方法包括try-catch-finally语句用于捕获和处理异常。try块包含可能抛出异常的代码。catch块用于捕获和处理try块中抛出的异常。可以有多个catch块每个catch块处理一种类型的异常。finally块无论try块中是否抛出异常都会执行。通常用于释放资源如关闭文件、释放数据库连接等。示例import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class TestException { public static void main(String[] args) { File file new File(test.txt); Scanner scanner null; try { scanner new Scanner(file); while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println(文件未找到); } finally { if (scanner ! null) { scanner.close(); System.out.println(资源已释放); } } } }执行流程如果try块中的代码正常执行没有抛出异常则执行finally块。如果try块中的代码抛出异常并且被catch块捕获则执行catch块中的代码然后执行finally块。如果try块中的代码抛出异常但没有被catch块捕获则执行finally块然后程序终止。throw语句用于手动抛出异常。示例public class TestThrow { public static void main(String[] args) { try { checkAge(15); } catch (IllegalArgumentException e) { e.printStackTrace(); System.out.println(e.getMessage()); } } public static void checkAge(int age) { if (age 18) { throw new IllegalArgumentException(年龄必须大于等于18岁); } System.out.println(年龄符合要求); } }输出结果java.lang.IllegalArgumentException: 年龄必须大于等于18岁 at TestThrow.checkAge(TestThrow.java:14) at TestThrow.main(TestThrow.java:6) 年龄必须大于等于18岁throws语句用于声明方法可能抛出的异常。示例import java.io.FileNotFoundException; import java.util.Scanner; public class TestThrows { public static void main(String[] args) { try { readFile(test.txt); } catch (FileNotFoundException e) { e.printStackTrace(); System.out.println(文件未找到); } } public static void readFile(String fileName) throws FileNotFoundException { File file new File(fileName); Scanner scanner new Scanner(file); while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } scanner.close(); } }4.1.4 自定义异常如果Java提供的异常类不能满足需求可以自定义异常类。自定义异常类通常继承自Exception受检异常或RuntimeException运行时异常。示例自定义一个受检异常类public class MyCheckedException extends Exception { public MyCheckedException() { super(); } public MyCheckedException(String message) { super(message); } public MyCheckedException(String message, Throwable cause) { super(message, cause); } public MyCheckedException(Throwable cause) { super(cause); } }使用自定义异常类public class TestMyCheckedException { public static void main(String[] args) { try { checkScore(85); checkScore(120); } catch (MyCheckedException e) { e.printStackTrace(); System.out.println(e.getMessage()); } } public static void checkScore(int score) throws MyCheckedException { if (score 0 || score 100) { throw new MyCheckedException(分数必须在0到100之间 score); } System.out.println(分数符合要求 score); } }输出结果分数符合要求85 com.example.MyCheckedException: 分数必须在0到100之间120 at TestMyCheckedException.checkScore(TestMyCheckedException.java:18) at TestMyCheckedException.main(TestMyCheckedException.java:8) 分数必须在0到100之间1204.2 集合框架4.2.1 学习目标与重点提示学习目标理解集合框架的基本概念掌握常用集合类List、Set、Map的使用方法了解集合的遍历和排序。重点List、Set、Map的区别、集合的遍历方法。4.2.2 集合框架的基本概念Java的集合框架Collection Framework是一组用于存储和操作数据的接口和类位于java.util包中。集合框架的核心接口包括Collection用于存储一组对象分为List和Set两个子接口。List有序的集合允许重复元素。Set无序的集合不允许重复元素。Map用于存储键值对键不允许重复值可以重复。集合框架的常用类ListArrayList、LinkedList、VectorSetHashSet、TreeSet、LinkedHashSetMapHashMap、TreeMap、LinkedHashMap、Hashtable集合框架与数组的区别对比项数组集合框架存储类型可以存储基本数据类型和对象只能存储对象长度固定长度动态长度操作方法提供的操作方法较少需要手动实现提供了丰富的操作方法如添加、删除、查找、排序等4.2.3 List接口List是有序的集合允许重复元素。常用的List类包括ArrayList和LinkedList。ArrayList基于动态数组实现查询速度快插入和删除速度慢。LinkedList基于双向链表实现查询速度慢插入和删除速度快。示例使用ArrayList和LinkedListimport java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class TestList { public static void main(String[] args) { // 使用ArrayList ListString arrayList new ArrayList(); arrayList.add(张三); arrayList.add(李四); arrayList.add(王五); arrayList.add(张三); // 允许重复元素 System.out.println(ArrayList的元素 arrayList); // 使用LinkedList ListString linkedList new LinkedList(); linkedList.add(张三); linkedList.add(李四); linkedList.add(王五); linkedList.add(张三); // 允许重复元素 System.out.println(LinkedList的元素 linkedList); // 遍历List System.out.println(\n遍历ArrayList的元素); for (String name : arrayList) { System.out.println(name); } System.out.println(\n遍历LinkedList的元素); for (int i 0; i linkedList.size(); i) { System.out.println(linkedList.get(i)); } } }输出结果ArrayList的元素[张三, 李四, 王五, 张三] LinkedList的元素[张三, 李四, 王五, 张三] 遍历ArrayList的元素 张三 李四 王五 张三 遍历LinkedList的元素 张三 李四 王五 张三4.2.4 Set接口Set是无序的集合不允许重复元素。常用的Set类包括HashSet、TreeSet和LinkedHashSet。HashSet基于哈希表实现插入、删除和查询速度快无序。TreeSet基于红黑树实现插入、删除和查询速度较慢但有序按自然顺序或自定义顺序排序。LinkedHashSet基于哈希表和链表实现插入、删除和查询速度较快有序按插入顺序排序。示例使用HashSet、TreeSet和LinkedHashSetimport java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; public class TestSet { public static void main(String[] args) { // 使用HashSet SetString hashSet new HashSet(); hashSet.add(张三); hashSet.add(李四); hashSet.add(王五); hashSet.add(张三); // 不允许重复元素 System.out.println(HashSet的元素 hashSet); // 使用TreeSet SetString treeSet new TreeSet(); treeSet.add(张三); treeSet.add(李四); treeSet.add(王五); treeSet.add(张三); // 不允许重复元素 System.out.println(TreeSet的元素 treeSet); // 使用LinkedHashSet SetString linkedHashSet new LinkedHashSet(); linkedHashSet.add(张三); linkedHashSet.add(李四); linkedHashSet.add(王五); linkedHashSet.add(张三); // 不允许重复元素 System.out.println(LinkedHashSet的元素 linkedHashSet); // 遍历Set System.out.println(\n遍历HashSet的元素); for (String name : hashSet) { System.out.println(name); } } }输出结果HashSet的元素[张三, 李四, 王五] TreeSet的元素[张三, 李四, 王五] LinkedHashSet的元素[张三, 李四, 王五] 遍历HashSet的元素 张三 李四 王五⚠️ 注意HashSet的输出顺序是无序的TreeSet的输出顺序是按自然顺序字符串的字典序排序的LinkedHashSet的输出顺序是按插入顺序排序的。4.2.5 Map接口Map是用于存储键值对的集合键不允许重复值可以重复。常用的Map类包括HashMap、TreeMap和LinkedHashMap。HashMap基于哈希表实现插入、删除和查询速度快无序。TreeMap基于红黑树实现插入、删除和查询速度较慢但有序按键的自然顺序或自定义顺序排序。LinkedHashMap基于哈希表和链表实现插入、删除和查询速度较快有序按插入顺序排序。示例使用HashMap、TreeMap和LinkedHashMapimport java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; public class TestMap { public static void main(String[] args) { // 使用HashMap MapString, Integer hashMap new HashMap(); hashMap.put(张三, 18); hashMap.put(李四, 20); hashMap.put(王五, 22); hashMap.put(张三, 19); // 键重复会覆盖原来的值 System.out.println(HashMap的元素 hashMap); // 使用TreeMap MapString, Integer treeMap new TreeMap(); treeMap.put(张三, 18); treeMap.put(李四, 20); treeMap.put(王五, 22); treeMap.put(张三, 19); // 键重复会覆盖原来的值 System.out.println(TreeMap的元素 treeMap); // 使用LinkedHashMap MapString, Integer linkedHashMap new LinkedHashMap(); linkedHashMap.put(张三, 18); linkedHashMap.put(李四, 20); linkedHashMap.put(王五, 22); linkedHashMap.put(张三, 19); // 键重复会覆盖原来的值 System.out.println(LinkedHashMap的元素 linkedHashMap); // 遍历Map System.out.println(\n遍历HashMap的元素); for (Map.EntryString, Integer entry : hashMap.entrySet()) { System.out.println(姓名 entry.getKey() 年龄 entry.getValue()); } System.out.println(\n遍历HashMap的键); for (String key : hashMap.keySet()) { System.out.println(姓名 key); } System.out.println(\n遍历HashMap的值); for (Integer value : hashMap.values()) { System.out.println(年龄 value); } } }输出结果HashMap的元素{张三19, 李四20, 王五22} TreeMap的元素{张三19, 李四20, 王五22} LinkedHashMap的元素{张三19, 李四20, 王五22} 遍历HashMap的元素 姓名张三年龄19 姓名李四年龄20 姓名王五年龄22 遍历HashMap的键 姓名张三 姓名李四 姓名王五 遍历HashMap的值 年龄19 年龄20 年龄224.2.6 集合的遍历与排序遍历集合List可以使用for循环、增强for循环或迭代器Iterator遍历。Set可以使用增强for循环或迭代器遍历。Map可以遍历键值对entrySet、键keySet或值values。排序集合List使用Collections.sort()方法排序该方法可以对实现了Comparable接口的对象进行排序或者使用Comparator接口自定义排序。SetTreeSet和LinkedHashSet可以自动排序HashSet需要转换为List后排序。MapTreeMap可以自动排序HashMap和LinkedHashMap需要转换为List后排序。示例对List进行排序import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class TestSort { public static void main(String[] args) { ListInteger nums new ArrayList(); nums.add(5); nums.add(2); nums.add(8); nums.add(1); nums.add(9); System.out.println(排序前 nums); // 自然排序升序 Collections.sort(nums); System.out.println(自然排序升序 nums); // 自定义排序降序 Collections.sort(nums, new ComparatorInteger() { Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); System.out.println(自定义排序降序 nums); } }输出结果排序前[5, 2, 8, 1, 9] 自然排序升序[1, 2, 5, 8, 9] 自定义排序降序[9, 8, 5, 2, 1]4.3 常见问题与解决方案4.3.1 异常未捕获问题程序抛出异常但未捕获导致程序崩溃。解决方案使用try-catch语句捕获异常或者在方法声明中使用throws语句声明可能抛出的异常。例如public class TestUncheckedException { public static void main(String[] args) { int[] nums {1, 2, 3}; System.out.println(nums[3]); // 数组下标越界异常但未捕获 } }输出结果Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 3 at TestUncheckedException.main(TestUncheckedException.java:5)修改后的代码public class TestUncheckedException { public static void main(String[] args) { int[] nums {1, 2, 3}; try { System.out.println(nums[3]); } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); System.out.println(数组下标越界); } } }输出结果java.lang.ArrayIndexOutOfBoundsException: 3 at TestUncheckedException.main(TestUncheckedException.java:7) 数组下标越界4.3.2 集合中存储的对象没有重写equals()和hashCode()方法问题当集合中存储的是自定义对象时如果没有重写equals()和hashCode()方法可能会导致无法正确判断对象是否相等。解决方案重写equals()和hashCode()方法。例如public class Student { private String id; private String name; private int age; // 构造方法、getter和setter方法 Override public boolean equals(Object o) { if (this o) return true; if (o null || getClass() ! o.getClass()) return false; Student student (Student) o; if (age ! student.age) return false; if (!id.equals(student.id)) return false; return name.equals(student.name); } Override public int hashCode() { int result id.hashCode(); result 31 * result name.hashCode(); result 31 * result age; return result; } }4.3.3 集合的并发修改异常问题在使用迭代器遍历集合时同时修改集合的结构如添加或删除元素会导致ConcurrentModificationException异常。解决方案使用迭代器的remove()方法删除元素或者使用ListIterator的add()方法添加元素。例如import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TestConcurrentModificationException { public static void main(String[] args) { ListString list new ArrayList(); list.add(张三); list.add(李四); list.add(王五); // 错误的做法使用for循环遍历并删除元素 for (String name : list) { if (name.equals(李四)) { list.remove(name); // 会导致ConcurrentModificationException } } // 正确的做法使用迭代器遍历并删除元素 IteratorString iterator list.iterator(); while (iterator.hasNext()) { String name iterator.next(); if (name.equals(李四)) { iterator.remove(); } } System.out.println(list); } }输出结果[张三, 王五]总结本章我们学习了Java的高级特性包括异常处理和集合框架。其中try-catch-finally的执行流程、自定义异常的实现、List/Set/Map的区别以及集合的遍历方法是本章的重点内容。从下一章开始我们将学习Java的IO流、多线程等内容。说真的这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis稳稳当当过日子。结果GPT、DeepSeek火了之后整条线上的人都开始有点慌了大家都在想“我是不是要学大模型不然这饭碗还能保多久”先给出最直接的答案一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享