一、异常
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