Java学习——day13

发布于:2025-03-04 ⋅ 阅读:(18) ⋅ 点赞:(0)


今日学习目标
在这里插入图片描述

1. 复习集合框架

1.1 List、Set 和 Map 的基本使用

(1)List(有序、可重复)

  • 主要实现类:ArrayList、LinkedList
  • 特点:
    • 允许存储重复元素
    • 保持插入顺序
    • 可以通过索引访问元素
  • 常见操作:
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Alice");  // 允许重复元素
list.remove("Bob");
System.out.println(list.contains("Alice"));  // true
for (String name : list) {
    System.out.println(name);
}

(2)Set(无序、不重复)

  • 主要实现类:HashSet(无序)、TreeSet(有序)
  • 特点:
    • 不允许存储重复元素
    • TreeSet 默认按自然顺序排序
  • 常见操作:
Set<String> set = new HashSet<>();
set.add("Alice");
set.add("Bob");
set.add("Alice");  // 不会重复
System.out.println(set.contains("Alice"));  // true
for (String name : set) {
    System.out.println(name);
}

(3)Map(键值对存储)

  • 主要实现类:HashMap(无序)、TreeMap(有序)
  • 特点:
    • HashMap 允许 null 作为键
    • TreeMap 会对键自动排序
  • 常见操作:
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 90);
map.put("Bob", 85);
map.put("Charlie", 92);
System.out.println(map.get("Alice"));  // 90
map.remove("Bob");
for (String key : map.keySet()) {
    System.out.println(key + ": " + map.get(key));
}

1.2 对比 List、Set 和 Map

特性 List Set Map
是否允许重复元素 允许 不允许 仅键唯一,值可重复
是否有序 按插入顺序 HashSet: 无序 HashMap: 无序
TreeSet: 自然排序 TreeMap: 按键排序
适用场景 需要索引访问、存储有序数据 需要去重的数据存储 需要存储键值对数据、

2. 复习异常处理

2.1 try-catch 语句

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("发生除零错误:" + e.getMessage());
}

分析:
代码执行流程
1)进入 try

  • 代码尝试执行 10 / 0
  • 由于 0 不能作为除数,Java 在运行时会抛出 ArithmeticException

2)异常抛出

  • 10 / 0 违反了数学运算规则,因此抛出 ArithmeticException,异常信息为:by zero

3)进入 catch

  • catch (ArithmeticException e) 捕获到 ArithmeticException,程序不会直接崩溃,而是执行catch内部代码。

4)输出错误信息

  • e.getMessage() 返回异常的详细信息(/ by zero)。
  • System.out.println("发生除零错误:" + e.getMessage()); 的输出结果为:
发生除零错误:/ by zero

2.2 throws 关键字

public void readFile(String fileName) throws IOException {
    FileReader file = new FileReader(fileName);
}
  • 代码执行流程
    1)方法声明

  • readFile(String fileName):一个公共方法,接收文件名作为参数。

  • throws IOException:声明该方法可能抛出IOException异常,调用此方法时,调用者必须处理这个异常。
    2)文件读取

  • FileReader file = new FileReader(fileName);试图打开 fileName 指定的文件进行读取。

  • 如果文件存在且可读,则 FileReader 正常创建。

  • 如果文件不存在、无权限访问或出现 I/O 错误,则 FileReader 抛出 IOException,方法执行中断。

2.3 自定义异常

class InvalidScoreException extends Exception {
    public InvalidScoreException(String message) {
        super(message);
    }
}

public class Test {
    public static void checkScore(int score) throws InvalidScoreException {
        if (score < 0 || score > 100) {
            throw new InvalidScoreException("成绩必须在 0 到 100 之间");
        }
    }
}

代码执行流程

步骤 操作
1 调用 checkScore(105),105 > 100,触发 throw new InvalidScoreException(“成绩必须在 0 到 100 之间”)
2 InvalidScoreException 被抛出,程序终止执行该方法
3 调用者需要 捕获异常(try-catch) 或 继续声明 throws

作用

  • InvalidScoreException(自定义异常)

    • 继承 Exception,表示它是一个 已检查异常(Checked Exception)。
    • 通过 super(message) 传递错误信息,方便在异常发生时输出具体信息。
  • checkScore(int score) 方法

    • 接收一个整数 score(成绩)。
    • 如果成绩小于 0 或大于 100,则抛出 InvalidScoreException,表示成绩不合法。
    • 由于 throws InvalidScoreException,调用 checkScore() 时 必须 处理异常(try-catch)或继续 throws 传递。

3. 实践项目:学生管理系统

功能需求

  • 使用 HashMap<String, Integer> 存储学生的姓名和成绩。
  • 允许用户输入学生姓名和成绩,并存入 HashMap。
  • 如果用户输入无效成绩(如负数或大于 100),则抛出 InvalidScoreException 并处理。
  • 允许用户查询学生成绩。

3.1 代码实现

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

// 自定义异常
class InvalidScoreException extends Exception {
    public InvalidScoreException(String message) {
        super(message);
    }
}

public class StudentManager {
    private static Map<String, Integer> studentMap = new HashMap<>();
    private static Scanner scanner = new Scanner(System.in);

    // 添加学生信息
    public static void addStudent(String name, int score) throws InvalidScoreException {
        if (score < 0 || score > 100) {
            throw new InvalidScoreException("成绩必须在 0 到 100 之间!");
        }
        studentMap.put(name, score);
        System.out.println("学生 " + name + " 添加成功,成绩:" + score);
    }

    // 查询学生成绩
    public static void getStudentScore(String name) {
        if (studentMap.containsKey(name)) {
            System.out.println(name + " 的成绩是:" + studentMap.get(name));
        } else {
            System.out.println("学生 " + name + " 不存在!");
        }
    }

    public static void main(String[] args) {
        while (true) {
            System.out.println("\n1. 添加学生信息\n2. 查询学生成绩\n3. 退出");
            System.out.print("请选择操作:");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 清除换行符

            if (choice == 1) {
                try {
                    System.out.print("请输入学生姓名:");
                    String name = scanner.nextLine();
                    System.out.print("请输入学生成绩:");
                    int score = scanner.nextInt();
                    scanner.nextLine();
                    addStudent(name, score);
                } catch (InvalidScoreException e) {
                    System.out.println("输入错误:" + e.getMessage());
                } catch (Exception e) {
                    System.out.println("输入无效,请重试!");
                }
            } else if (choice == 2) {
                System.out.print("请输入要查询的学生姓名:");
                String name = scanner.nextLine();
                getStudentScore(name);
            } else if (choice == 3) {
                System.out.println("退出系统!");
                break;
            } else {
                System.out.println("无效选项,请重新选择!");
            }
        }
    }
}

3.2 运行示例

1. 添加学生信息
2. 查询学生成绩
3. 退出
请选择操作:1
请输入学生姓名:Alice
请输入学生成绩:95
学生 Alice 添加成功,成绩:95

1. 添加学生信息
2. 查询学生成绩
3. 退出
请选择操作:1
请输入学生姓名:Bob
请输入学生成绩:110
输入错误:成绩必须在 0 到 100 之间!

1. 添加学生信息
2. 查询学生成绩
3. 退出
请选择操作:2
请输入要查询的学生姓名:Alice
Alice 的成绩是:95

4. 总结

4.1 集合框架

集合类型 主要实现类 特点
List ArrayListLinkedList 允许重复元素,按插入顺序存储
Set HashSetTreeSet 不允许重复元素,TreeSet 具有排序功能
Map HashMapTreeMap 键唯一,值可重复,TreeMap 键自动排序

4.2 异常处理

异常类型 说明 处理方式
try-catch 捕获并处理异常 用于处理运行时异常
throws 声明异常 用于方法可能抛出的异常
自定义异常 继承 Exception RuntimeException 用于特定业务逻辑

5. 今日生词

1.audio 2.packages 3.inspector 4.effects 5.models


网站公告

今日签到

点亮在社区的每一天
去签到