JAVA基础篇 异常和线程

异常和错误的介绍
异常指的是不正常,指的是程序中出现了某些问题
在java中,所有的问题都可以使用一个类来表示,这个类叫做Throwable
Throwable 是所有异常和错误的父类

Throwable 有两个子类
Exception(异常)指的是程序中出现的一些轻微的问题,这些问题时可以挽回,补救的,相当于人得了感冒
Error(错误) 指的时程序中出现的一些严重的,致命的问题,这些问题不可挽回,相当于人得了绝症

Throw关键子手动抛出异常
如果不希望自动抛出异常,那么可以使用throw关键子手动抛出异常
throw的作用,手动抛出一个异常对象
throw的格式 throw new 异常类名()

在创建异常对象的时候,可以在构造方法中给出异常信息

Objects的requireNonNull方法
Objects中有一个方法,可以判断一个对象是否为null,如果是null,那么就会抛出异常
Static T requireNonNull(T obj)判断参数obj是否为null,如果是null,那么抛出异常
static T requireNonNull(T obj,String message)第二个参数表示异常信息

Throws关键子的使用
throw 用来手动抛出一个异常
throws 表示进行异常声明,声明这个方法是有可能抛出异常的

throws的使用注意事项
如果一个方法内抛出了编译时异常,那么则必须要使用throws进行异常声明
如果调用了使用throws声明异常的方法,那么调用者要么解决这个异常,要么也加throws声明
如果这个方法内抛出运行时异常,那么无需使用throws进行声明
如果在一个方法内有可能抛出多个异常,那么需要进行多个异常声明
如果在一个方法内有可能抛出多个异常,那么也可以直接声明这些异常的父类异常

try…catch的使用
之前处理异常的方法都是甩锅,把异常抛给调用者,出了可以把异常抛给调用者之外,还可以使用try…catch解决
try…catch表示捕获处理,表示真正解决了这个异常

try…catch格式
try{
代码块
}catch(异常类名 变量名){
出现异常后执行的代码
}

try…catch的执行流程
第一种情况 如果try中的代码没有遇到问题,那么代码会跳过catch继续往下执行
第二种情况 如果try中的代码出现了异常,并且catch捕获到了这个异常,代码会从try直接执行到catch
第三种情况 如果try中的代码出现了异常,但是catch没有捕获到,这个异常会依旧往外抛,抛给调用者

小结 异常处理有两种方式
往外抛(甩锅)throw,throws
解决异常 try…catch

finally代码块
try…catch后面可以再追加一个finally,finally中的代码,无论如何都会执行

格式
try{
可能出现问题的代码
}catch(要捕获的异常类名 变量名){
出现异常会执行的代码
}finally{
一定会执行的代码
}

执行流程
第一种情况 如果try中的代码没有问题 那么执行try 和 finally里面的代码
第二种情况 如果try中的代码有异常 并且catch捕获到了这个异常,那么执行流程为 三个代码块都会执行
第三种情况 如果try中的代码有异常,但是catch没有捕获到这个异常,那么执行流程为 try finally 并且抛出异常

finally中的代码一定会执行,通常finally中的代码都会用作资源回收(IO流中的关闭流,JDBC中的释放连接)
注意 有两种情况 finally中的代码不会执行 1 JVM停止运行 2方法遇到了return

编译时异常和运行时异常的区别
运行时异常和编译时异常的区别
在方法内抛出运行时异常,那么在编译时期可处理也可以不处理
在方法内抛出编译时异常,那么在编译时期必须要处理,要么使用throws声明这个异常(是往外抛的),要么使用try…catch解决这个异常

继承中方法重写的异常注意事项
继承关系中方法重写时异常的注意事项
如果父类方法没有抛出异常,那么子类重写该方法时,可以抛,也可以不抛
如果抛,要么抛出和父类方法相同的异常,要么抛出父类方法的子类异常

上面的注意事项只适用于编译时异常

多catch处理的注意事项
如果要使用try…catch语句捕获多个异常,那么可以在语句后面跟上多个catch
格式

try {
可能会出现问题的代码
} catch(要捕获的异常类 变量名) {
出现该异常后的处理方式
} catch(要捕获的异常类 变量名) {
出现该异常后的处理方式
} catch(要捕获的异常类 变量名) {
出现该异常后的处理方式
}

执行流程
会先执行try中的代码
如果try中的代码没有异常,那么所有的catch都不会执行
如果try中的代码有异常,那么 哪个catch先捕获到这个异常,那么就执行哪个catch中的语句,剩下的catch就不会执行了

注意事项
如果使用catch捕获多个异常,那么父类异常不能放在子类异常前面

throwable的常见方法
throwable中有一些方法可以获取到异常信息
void pintStackTrace() 将相依的异常信息进行输出
String getMessage() 获取简单异常信息,并将该异常信息返回

上面的方法不能直接创建对象,然后去调用,上面的方法要放在catch中去使用

自定义异常
如何自定义异常 认贼做父,找一个异常类当做父类
如果类继承的是编译时异常类,那么这个类就是编译时异常
如果类继承的是运行时异常类,那么这个类就是运行时异常

public class RegisException extends RuntimeException 这个类继承了 runtimeException 那么这个类就是衣蛾运行时异常
public RegisException (String msg){
super(msg) //口岸和偶参加按摩后信息交给父类,由父类完成赋值 msg表的就是异常信息
}

程序中的main线程
每一个程序都至少包含一个线程,之前写的java程序和异常
当运行程序的时候,JVM会创建一个main线程,main线程去执行main方法

如果一个程序只有一个线程,那么这个程序就是单线程程序,单线程程序同时只能执行一个任务
如果有多个任务,那么只能先执行完其中一个在执行另一个

如果想要同时执行多个任务,可以使用多线程程序

多线程程序的实现
在java中,有一个类叫做thread,这个类表示线程类,并且可以使用这个类实现多线程程序
多线程的创建步骤
1 定义一个类,去继承thread类
2 在这个类重写thread类的run方法,并在run方法中编写线程要执行的任务
3 创建Thread子类对象
4 调用thread子类对象的start方法启动线程,线程会执行自己的run方法

thread中的start方法
void start() 导致此线程开始执行 java虚拟机调用此线程的run方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值