第十章 Java-异常、泛型、集合框架

一、异常

1、什么是异常

异常:表示程序出现问题,比如读取的文件不存在,读取网络数据的时候断网了

2、异常体系

在这里插入图片描述

3、异常处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
抛出所有异常使用:throws Exception, 这样在处理的时候就处理这一个异常,打印所有异常信息

4、异常的作用

在这里插入图片描述
在这里插入图片描述

5、自定义异常

Java无法为所有问题提供异常类代表,如果自己代码的某种问题,想通过异常表示,以便用异常来管理该问题,那就需要用到自定义异常类了。 自定义异常分为2类:
在这里插入图片描述

// 自定义一个异常类AgelegalException 

/**
 * 自定义异常类
 * 1、继承Exception
 * 2、重写构造方法
 * 3、抛出异常
 * */
public class AgelegalException extends Exception {

    // 无参构造方法
    public AgelegalException() {

    }
    // 有参构造方法
    public AgelegalException(String message) {
        super(message);
    }

}
// 应用
public class exception2 {
    public static void main(String[] args) {
    // 异常处理
        try {
            checkAge(300);
            System.out.println("年龄合法");
        } catch (AgelegalException e) {   
            e.printStackTrace();
            System.out.println("年龄不合法");
        }
        System.out.println("程序结束了。。");

    }

    // 需求:年龄小于1岁或者大于200岁,则抛出异常
    public static void checkAge(int age) throws AgelegalException {
        if(age < 1 || age > 200){
            throw new AgelegalException("年龄非法,请注意"); // 抛出异常
        }
        System.out.println("年龄合法啦");
    }
}

6、异常处理方案

6.1 方案1

底层异常都抛出去给最外层调用者,最外层捕获异常,记录异常,响应合适信息给用户观看。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class exception3 {
    public static void main(String[] args) {
        System.out.println("==程序开始....==");
        try {
            show();
            System.out.println("==操作成功了....==");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("==操作失败....==");
        }
        System.out.println("==程序结束....==");
    }
    // 定义show方法,编译异常
    public static void show() throws Exception {
        // 编译异常,编译阶段报错,继承自 Exception
        String str = "2024-07-09 11:21:13";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(str);
        System.out.println(date);
        InputStream isr = new FileInputStream("D:/meiv.png");
    }
}

6.2 方案2

最外层捕获异常后,尝试修复
在这里插入图片描述

二、泛型

在这里插入图片描述

1、泛型类

在这里插入图片描述
E:代表元素的类型
T:代表返回值类型
K:键类型
V:值类型

// 自定义一个泛型类
import java.util.ArrayList;
public class MyArrayList<E> {
    private ArrayList list = new ArrayList();
    public boolean add(E e)
    {
        list.add(e);
        return true;
    }
    public boolean remove(E e)
    {
        return list.remove(e);
    }
    @Override
    public String toString()
    {
        return list.toString();
    }
}
// 应用
public class exp1 {
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        System.out.println(list);
        list.remove("李四");
        System.out.println(list);
    }
}

2、泛型接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、泛型方法、通配符、上下限

3.1 泛型方法

在这里插入图片描述
在这里插入图片描述

3.2 通配符

在这里插入图片描述
** 注意:ArrayList是本来就存在Java的一个集合,而不是自定义的。
下列案例中:
1、定义了一个Car父类
2、定义了Xiaomi、BYD子类,两个都继承Car类
3、使用ArrayList集合分别定义了Xiaomi、BYD的集合
4、由于都调用了go方法,因此传参不能限定为某一类,而是使用了通配符的ArrayList集合,表示接收任意类型,这样go 方法就具备了通用的能力
在这里插入图片描述

3.3 泛型的上下限

作用:限制参数的类型
在这里插入图片描述
在这里插入图片描述

3.4 泛型支持的类型

1、泛型不支持基本数据类型,只能支持对象类型(引用数据类型)
底层逻辑是这样的:泛型工作在编译阶段,等编译后泛型就没有用了,所以泛型在编译后都会被擦除,所有类型会回复成Object类型,
把基本类型的数据赋值给Object类型会报错,因此泛型不支持基本数据类型
在这里插入图片描述
2、如何让泛型支持基本数据类型呢?这就用到了包装类

什么是包装类?

在这里插入图片描述

public class test {
    public static void main(String[] args) {
        // 手工包装
         // Integer i = new Integer(100); // 包装类,已过时
          Integer i = Integer.valueOf(100);
          
        // 自动包装(自动装箱:基本数据类型的数据可以直接变成包装对象的数据,不需要额外做任何事情)
        Integer j = 100; // 和上面的Integer i = Integer.valueOf(100);语句等价

        // 自动拆箱(自动拆箱:包装对象可以自动的把包装对象变成基本数据类型的数据,不需要做任何事情)
         int  k = j;
         System.out.println(k);

         // 应用
        ArrayList&l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值