今天学习的内容很少,只有异常跟多线程,代码不多重要的是理解
时间2022/4/16
异常
概念:
程序出现了不正常的状态就是异常
分类
Throwable
Error(错误)
错误和我们程序员一般没有关系,通常是硬件问题
Exception(异常)
编译时异常:
除了运行时异常其他都是编译时异常
代码上会有红色波浪线报错
运行时异常:
RuntimeException以及他的子类
代码上没有提示
以前常见的异常:
编译时异常:
解析异常 ParseException
文件找不到异常 FileNotFoundException
运行时异常:
索引越界异常 ArrayIndexOutOfBoundsException
空指针异常 NullPointerException
类型转换异常 ClassCastException
并发修改异常 ConcurrentModificationException
如何解决异常:
1.运行时的异常不需要专门解决,一般是因为代码写错了,只要修改代码即可。
2.编译时的异常是程序检测可能会出问题的代码,有红色波浪线,所以我们必须要解决报错。
方式一:throws声明抛出异常
定义在方法后面,加上throws 后面跟上要抛出的异常名字,注意这里的抛出是抛给方法的调用者,谁调用这个方法就要去解决这个问题。
方式二:利用try…catch捕获异常
格式: try{
可能出现异常的代码
}catch(异常类型 异常变量名){
}catch(异常类型 异常变量名){
}
try里面没有出现异常,就不会执行catch语句
try里面如果出现了异常,就会执行对应的catch语句
当trycatch执行结束后,异常就相当于就已经解决了,程序可以继续往后执行
两种办法有什么区别:
throws声明抛出异常:没有解决异常,把问题抛给了别人。
trycatch捕获异常:解决了异常,异常就已经被解决程序能够继续正常向后执行。
异常的注意事项:
1.一个try可以写多个catch, 上面的catch捕获的异常不能是下面的父类。
2.方法重写子类的方法不能抛出比父类更多的异常。
catch里面的方法:
getMessage() : 获取异常的产生原因
toString() : 获取异常的类型和产生原因
printStackTrace() :直接打印异常的类型和产生原因还有产生位置。
finally语句块:
finally可以加在try语句的最后
finally里面的代码是一定会执行的代码(除非退出虚拟机)System.exit(0);
如何产生异常:
格式:
throw new 异常类型();
自定义异常:
自定义就是自己定义一种异常类型
比如我们年龄如果是赋值错误就要产生异常,刚才产生的是一个普通异常,这个是不合适的
我想要产生年龄越界异常,java有这个异常?当然没有
我们想要自定义一个异常类型,就先看看java中的异常是怎么定义的.我们模仿就可以了
多线程
名词解释:
进程和线程:
一个进程就是我们应用软件的一次启动
一个线程是进程中的一条执行单元
并发和并行:
并发是指一个时间段中有几个程序都处于已启动到完毕之间,但任一个时刻点上只有一个程序在运行。
并行是指多个程序是在同一时刻点上是一起执行的。
计算机的一个CPU就是通过并发的方式在运行多个线程
开启多线程的方式:
继承Thread类
步骤:
1.定义类继承Thread
2.重写run()方法
3.在测试类中创建子类对象
4.调用start()方法开启线程
实现Runnable接口
1.创建子类实现Runnable接口
2.重写run()方法
3.在测试类中创建子类对象
4.创建线程Thread的对象
两种方式有什么区别:
两种方式开启线程功能上是一样的效果
区别就在于继承和实现的区别:
继承:java的类是单继承
实现:java的类是多实现
为什么要开启多线程:
多线程可以提高程序效率
线程的常用方法:
开启线程:
start() :开启一个新线程(每个线程对象只能开启一次新线程)
和线程名字相关的方法:
setName() :给线程设置名字
getName() :获取线程的名字
static currentThread() :获取当前正在执行的线程对象
线程睡觉:
static sleep(时间) :让当前线程睡觉指定时间(谁执行sleep谁就睡觉,时间单位是毫秒)
匿名内部类开启线程写法
使用匿名内部类完成继承Thread的写法:
Thread t = new Thread(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread"+i);
}
}
};
t.start();
使用匿名内部类完成实现Runnable的写法:
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Runnable" + i);
}
}
};
Thread t2 = new Thread(r);
t2.start();
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("开启线程");
}
}).start();