泛型
广泛的数据类型
确保类型安全的一种途径
定义:类和方法上都可以定义泛型
public class EasyGenericity<J,M,N,Y,Easy>
J,M,N,Y,Easy代表一种类型
类和方法定义同一种类型
不冲突,选择就近原则
public<E>Etest(Ee){
//返回的类型和传入的类型是同一种
returne;
}
//上限
public<J extends List>JtestA(Jj){
returnj;
}
//public static <Asuper
private M m;
public void testB(M m,J j){
}
public static void main(String[ ] args){
//类型安全
List list = new ArrayList();
list.add("123");
list.add(new Object());
for(Object obj : list){
System.out.println(obj);
//在类型转换的时候没有明确对象的数据类型进行强制类型转换
//这时候就会抛出ClassCastException(类型转换异常)
//这就是类型不安全
//Stringstr=(String)obj;
//System.out.println(str);
}
//定义泛型的类型在声明上定义类型
List<String>lista=new ArrayList<>();
lista.add(String.valueOf(123));
lista.add("123");
for(String str : lista){
System.out.println(str);
}
Map<String,Object>map = new HashMap<>();
map.put("123",123);
}
异常
异常
程序中一些程序处理不了的特殊情况
异常类Exception
见过的异常NullPointerException、ArrayIndexoutOfBoundsException
异常的分类:
- 检查型异常(编译异常):在编译时就会抛出的异常(代码会报错),需要在代码中编写处理方式
最具代表的检查性异常是用户错误或问题引起的异常,这些异常在编译时强制要求程序员处理。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
这类异常通常使用 try-catch 块来捕获并处理异常,或者在方法声明中使用 throws 子句声明方法可能抛出的异常。
- 运行时异常:在代码运行阶段可能会出现的异常,可以不用明文处理
这些异常在编译时不强制要求处理,通常是由程序中的错误引起的,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,这类异常可以选择处理,但并非强制要求。可以通过代码避免异常的发生继承RunTimeException
- 错误: 错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
当程序中出现异常,就会中断程序,代码不会继续运行
- try:用于包裹可能会抛出异常的代码块。
- catch:用于捕获异常并处理异常的代码块。
- finally:用于包含无论是否发生异常都需要执行的代码块。
- throw:用于手动抛出异常。
- throws:用于在方法声明中指定方法可能抛出的异常。
- Exception类:是所有异常类的父类,它提供了一些方法来获取异常信息,如 getMessage()、printStackTrace() 等。
异常处理通常使用 try-catch-finally 块来处理,也可以使用 throws 关键字将异常抛出给调用者处理。
try-catch-finally
finally 块常用来关闭一些连接资源
catch合并处理方案一个catch块捕捉多种异常
try处理多种异常
catch合并处理方案一个cathch块捕捉多种异常
catch通过声明父类异常捕捉所有子类异常
catch 异常捕捉的顺序 子类异常优先处理,父类异常后置处理
如果catch块抛出了异常,没有finally就会中断程序
如果有finally,会运行finally会运行,并且正常返回,此方法结束
try不能单独编写,必须有其他语句块
try块中没有异常,不能随便检查异常
- 使用 try-catch 块捕获并处理异常,可以避免程序因异常而崩溃。
- 可以使用多个 catch 块来捕获不同类型的异常,并进行不同的处理。
- 可以使用 finally 块来执行一些必要的清理工作,无论是否发生异常都会执行。
- 可以使用 throw 关键字手动抛出异常,用于在程序中明确指定某些异常情况。
- 可以使用 throws 关键字将异常抛出给调用者处理,用于在方法签名中声明可能会出现的异常。
- Checked Exception 通常是由于外部因素导致的问题,需要在代码中显式地处理或声明抛出。
- Unchecked Exception 通常是由于程序内部逻辑或数据异常导致的,可以不处理或者在需要时进行处理。
- 在处理异常时,应该根据具体的异常类型进行处理,例如可以尝试重新打开文件、重新建立网络连接等操作。
- 异常处理应该根据具体的业务需求和设计原则进行,避免过度捕获和处理异常,从而降低程序的性能和可维护性。
throw、throws关键字
在Java中, throw 和 throws 关键字是用于处理异常的。
throw 关键字用于在代码中抛出异常,而 throws 关键字用于在方法声明中指定可能会抛出的异常类型。
throw 关键字用于在当前方法中抛出一个异常。
通常情况下,当代码执行到某个条件下无法继续正常执行时,可以使用 throw 关键字抛出异常,以告知调用者当前代码的执行状态。
throws 关键字用于在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
throw 和 throws 的区别
throws ArithmeticException;
throw new ArithmeticException("算术异常");
- 1)throws 关键字用于声明异常,它的作用和 try-catch 相似;而 throw 关键字用于显式的抛出异常。
- 2)throws 关键字后面跟的是异常的名字;而 throw 关键字后面跟的是异常的对象。
- 3)throws 关键字出现在方法名上,而 throw 关键字出现在方法体里。
- 4)throws 关键字在声明异常的时候可以跟多个,用逗号隔开;而 throw 关键字每次只能抛出一个异常。
-
finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
注意:
catch 不能独立于 try 存在。
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try, catch, finally 块之间不能添加任何代码。
自定义异常
抛出的异常只能更精确
方法重写:子类对父类中继承过来的方法进行重新定义
约束:返回值类型、方法名、参数列表不能变
访问权限只能更开放
抛出的异常只能更精确