异常API+线程API
1、常见异常
①算数异常:java.lang.ArithmeticException
System.out.println(2 / 0);
②数组下标越界异常:java.lang.ArrayIndexOutOfBoundsException
int[] arr = {1,2,3};
System.out.println(arr[3]);
③数字转换异常:java.lang.NumberFormatException
int i = Integer.parseInt("你");
System.out.println(i);
④日期解析异常:java.text.ParseException
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date d = f.parse("2021年04-14");
System.out.println(d);
⑤文件找不到异常:java.io.FileNotFoundException
FileReader f = new FileReader("d:/x.txt");
2、异常
(1)异常类型:
①非检查型异常:不是强制处理的异常(处不处理都可以)
②检查型异常:【必须处理】的异常
(2)异常体系:
java.lang.Throwable(异常顶级父类)
java.lang.Error(错误、非检查)
java.lang.Exception(异常)
java.lang.RuntimeException(运行时异常、非检查)
其它(检查型)
(3)处理异常两种方式
①捕获异常:通过【try、catch】关键字实现。【实现方法】出问题捕获。【语法/代码】异常。
②抛出异常:通过【throws】关键字实现。【调用方法】出问题抛出。【业务】异常。
// 张三调用方法
try {
m1("d:/a123123.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 李四实现方法
private static void m1(String file) throws FileNotFoundException {
FileReader f = new FileReader(file);
}
(4)处理异常的5个关键字
①捕获:try、catch、finally
try:包含可能出问题的代码块
catch:捕获异常并输出异常信息
finally:不论是否有异常发生都一定会执行的语句块(一定要执行的代码放在 finally 里)
try {
FileReader f = new FileReader("c:/a.txt");
System.out.println(1);
System.out.println(2);
System.out.println(3);
f.close();
} catch(Exception e) {
e.printStackTrace();
} finally {
System.out.println("一定执行的代码");
}
// 多个异常捕获的方式:全选异常代码->右键->surround with->try/catch
try {
FileReader f1 = new FileReader("c:/a.txt");
FileReader f2 = new FileReader("c:/a.txt");
FileReader f3 = new FileReader("c:/a.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
②抛出:throw、throws(方法调用者执行)
throw和throws的区别:
(1)异常类型
①throw表示抛出的异常的实例,throw (异常对象)。
②throws表示抛出的异常的类型,异常类可以声明多个,用逗号分割。
(2)使用的位置
①throw出现在方法体
②throws出现在方法参数列表的后面
(3)使用方式
①throw要么和try-catch-finally语句配套使用捕获异常,要么与throws配套使用抛出异常。
②throws由处理异常的方法捕获。
(4)作用不同
①throw用于程序员自行产出并抛出异常
②throws用于声明该方法内抛出异常
3、反射API(了解)
理解:一种**看透Java的一组功能。反射所有功能都是通过class API**来实现的。
反射API举例:生成getter、setter方法弹出对话框,里面有类中的所有变量供我们选择
说明:反射API、线程API属于高级API。开发技术的技术。
举例:例如**SpringBoot、Spring、Mybatis**等框架底层都是反射实现的。
4个反射核心API:
java.lang.Class | 类 |
---|---|
java.lang.reflect.Field | 成员变量类型 |
java.lang.reflect.Method | 成员方法类型 |
java.lang.reflect.Constructor | 构造方法类型 |
// 获取类对象(参数:包名.类名,找到这个包下的这个类)
Class c = Class.forName("com.cuiyudong.Person");
// 获取成员变量(返回的是一个数组)
Field[] arr = c.getDeclaredFields();
for (Field f:arr) {
System.out.println(f.getName());
}
// 获取构造方法
Constructor[] brr = c.getConstructors();
for (Constructor t:brr) {
System.out.println(t.getName());
}
// 获取成员方法
Method[] crr = c.getDeclaredMethods();
for (Method m:crr) {
System.out.println(m.getName());
}
// 获取父类
Class f = c.getSuperclass();
System.out.println(f.getName());
// 获取接口
Class[] drr = c.getInterfaces();
for (Class d:drr) {
System.out.println(d.getName());
}
4、线程API(了解)
(1)目前为止开发程序都是单线程的:
while (true) {
System.out.println(Thread.currentThread().getName());
}
(2)多线程
①Java后台运行机制是多线程机制。多线程程序。
②Servlet、Struts2、SpringMVC等。
③举例: 100个人同时登陆淘宝
100个人 登陆控制器(100个登陆对象)
100个人 登陆控制器(创建一个登陆对象、开启100个线程)
(3)多线程的两种实现方式
方式一:继承java.lang.Thread(类)
//多线程实现
public class A extends Thread {
public void run() {
while (true) {
// 输出当前线程的名字
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args) {
A a1 = new A();
a1.start();// 启动线程
A a2 = new A();
a2.start();// 启动线程
A a3 = new A();
a3.start();// 启动线程
while (true) {
// 输出当前线程的名字(主线程)
System.out.println(Thread.currentThread().getName());
}
方式二:实现java.lang.Runnable(接口):Thread implements Runnable
public class B implements Runnable {
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args) {
B b1 = new B();
Thread t1 = new Thread(b1);
t1.start();
B b2 = new B();
Thread t2 = new Thread(b2);
t2.start();
}