第一章 异常
1、异常的概念
1. 问题描述: 异常是什么意思?为什么要存在异常?
回答: 异常是程序出现的问题。存在的原因:可以很好的去解决对应的问题。
//生活实例: 汽车的轮胎,可能会出现异常"漏气"胎上面有个小孔,怎么解决?把
//胎放在水里面,挤压一下,看看有没有气泡
2. 常见的分类问题
A. 异常:
a. 概念:一个程序可能出现的问题。有可能出现问题,有可能不出现问题。 //想想 数组索引越界异常
b. 运行时异常: 在运行的过程当中,出现的异常。代码写完不会出错,运行过程当中出错
c. 编译时异常: 代码一写完就会出错。
B. 错误:
a. 概念: 出现了非程序原因导致的问题。//例如: 内存溢出的错误
2、异常处理的两种方式
1. 抛出异常(自己不处理,交给别人处理)
A. 格式:
在方法的小括号后面.加上 throws XXXEception
B. 例如:
public static void calc(int[] arr) throws ArrayIndexOutOfBoundsExcption{ ... }
2. 捕获异常(自己处理异常)
A. 格式:
try{
....可能出现异常的代码....
}catch(XXXEception e){
....出现异常之后的处理代码...
}finally{
...无论是否出现异常都会执行的代码....
}
3、异常处理的入门案例
public static void main(String[] args) {
//定义状态码
int stateCode = 200;
try {
// 调用方法(谁调用方法,谁处理异常)
// 快捷键 Ctrl + Alt + T
method();
} catch (ArithmeticException e) {
e.printStackTrace(); //直接打印显示处理
stateCode = 404;
System.out.println("在长江职业学院,被蚂蚁踩伤了"+stateCode);
} catch (NullPointerException e) {
e.printStackTrace();//直接打印显示处理
stateCode = 500;
System.out.println("在中南民族大学,被妹子迷了"+stateCode);
} catch (ClassCastException e) {
e.printStackTrace();//直接打印显示处理
stateCode = 10086;
System.out.println("在中南财经政法大学,被老太太鹅了"+stateCode);
} finally {
System.out.println("不管有没有异常,都显示.回家戳麻将"+stateCode);
}
}
//throws 抛出异常.[自己不处理,交给别人处理] throw 制造异常
public static void method() throws ArithmeticException,NullPointerException,ClassCastException {
int number = 3/1;//零不能作为除数
System.out.println("number = " + number);
String str = "";
int len = str.length(); //出现空指针异常
System.out.println("len = " + len);
//现场制造一个异常(格式: throw new 异常的名称)
throw new ClassCastException("嘿嘿!被蚂蚁踩伤");
}
4、异常处理的三个方法
1. String getMessage(); //异常的原因
2. String toString(); //异常的类型
3. void printStackTrace(); //异常的原因+异常的类型+异常的位置 ---> 红色信息
5、异常的注意事项
1. 子父类异常处理
子类在上,父类在下。 //原因: 程序从上往下执行,如果上面的父类,已经处理了,就不关儿子什么事情了。
2. 方法重写异常的问题
父类方法异常是什么样子,子类方法异常就是什么样子。
A.如果父类的方法是 抛出异常,那么子类的方法也是 抛出异常
B.如果父类的方法是 捕获异常,那么子类的方法也是 捕获异常
6、自定义异常类
操作步骤
A.写一个类 继承 Exception 或者 RuntimeException
//继承 Exception 编译时异常,代码写完就会报错
//继承 RuntimeException 运行时异常,代码写完不会报错,运行的过程当中,可能会出错
B.实现两个构造方法
a. 无参空构造
b. 带有字符串参数的构造.(字符串:就是异常的原因)
C.在需要的地方,制造一个异常即可
throw new XXException(异常原因);
第二章 线程
1、概念问题
1. 并发和并行
A. 并发: "交替执行"
B. 并行: "同时执行"
2. 进程和线程
A. 进程: 进入到内存当中的应用程序。(例如:我们下载了一个QQ.exe 只有开启了QQ.exe进入内存,才算是进程)
B. 线程: 线程是进程当中的一个执行单元。
//例如: 腾讯电脑管家,开启之后,进入内存当中。他就是‘进程’
//在电脑管家当中,可以同时执行多个任务。如: "病毒查杀"、"清理垃圾"、"电脑加速" 都是线程
//例如: 迅雷软件,启动之后,进入到内存当中。他就是‘进程’
//在迅雷软件当中,下载电视剧《还珠格格》,开启多条路径下载。 每一条路径就是一个线程
3. 线程的调度
"抢占式调度" 多个线程,抢夺CPU的执行权。谁抢到就执行谁!
//例如: 下课期间,多个同学,抢夺坑位,谁先抢到,谁就有优先执行权!
4. 主线程
A. 主线程: main方法通向CPU的路径桥梁
B. 理解: "main方法所在的线程,就是主线程"
//例如: 主线程,看做是主线任务。(主线任务:必须要走的,不走不让你升级)(支线任务:可以做可以不做)
2、多线程的实现方式
1. 方式一: 继承Thread类
A.步骤:
a.写一个类,继承 Thread 类
b.覆盖重写 run 方法
c.创建线程类的对象
d.调用 start 方法开启线程
2. 方式二: 实现Runnable接口 //源码: class Thread implements Runnable 《推荐使用》
A.步骤:
a.写一个类,实现 Runnable 接口
b.覆盖重写 run 方法
c.创建线程对象,传入的参数是实现类的对象
d.调用 start 方法开启线程
3、几个API
1. 设置线程的名称
mt1.setName("子唯"); //其中mt1是线程子类的对象
2. 获取当前执行线程的名称
String name = Thread.currentThread().getName();
3. 线程休眠一下
//--------让线程休息一下------
try {
Thread.sleep(100); //100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
//--------------------------
答疑: 开启线程的时候。为什么不是调用 run 方法 而是调用 start 方法?
回答: 如果开启线程使用的是 run 方法,那么是主线程执行。单纯的对象调用方法。和多线程没有关系了
如果开启线程使用的是 start 方法,那么是子线程执行。不再受到主线程影响。