今日内容
异常
多线程
异常
什么是异常
异常就是不正常的情况,在Java中的异常指的是程序在运行过程中出现的错误
Java是面向对象的语言,所有的东西都可以封装对象,异常也照样被封装成了对象,方便我们对这些错误
进行研究和解决,这些对象肯定有对应的类,这些类就是异常类,在程序中可能出现各种各样的错误,所以定义了
很多的异常类,这些异常类的共性不断向上抽取就形参了异常的体系
异常的体系结构
Throwable(类)
|-Error:严重的错误,程序员不能通过异常的处理(比如捕获、抛出)代码解决的问题,比如:内存溢出,数据库崩溃,服务器宕机了
|-Exception:非严重的错误,可以通过代码处理的错误
|-运行时异常:包括RuntimeException及其子类
|-编译时异常:包括Exception下除了RuntimeException及其子类之外的所有异常
运行时异常:在运行时期才会报出的异常,编译时期不会报错,在编译时期可以处理也可以不处理
编译时异常:在编译时期就报出的异常,编译时期必须对其进行处理,否则编译报错
throw关键字
位置:
在方法内
作用:
制造异常的方式
可以抛出异常对象或者异常对象名
异常处理
方式一:抛出
throws关键字
位置:
在方法声明上小括号后面
在方法的声明上使用throws抛出异常类名,可以同时抛出多个,多个之间使用逗号(,)隔开
如何我们自己不想处理或者没有能力处理的时候,使用throws来处理异常,这种处理方式是抛出
别人(方法的调用者)来处理
throws抛出只处理编译时异常,不会处理运行时异常
方式二:捕获
try...catch...finally
格式一:
try{
}catch(异常类型 变量名){
}
格式二:
try{
}catch(异常类型 变量名) {
}finally{
}
格式三:
try{
}finally{
}
格式解释:
try: 用于检测代码是否有异常,一般存放的是有可能出现异常的代码
catch: 用于捕获和处理异常,小括号用于捕获,大括号用于处理
finally:用于处理收尾工作,比如释放资源等,一般存放的一定要执行的代码
finally语句块中的代码一定会被执行,不论是否发生异常
格式的注意事项:
(1)try/catch/finally这三个语句块不能单独存在
只能组成上面三种格式,没有其他组成了
(2)在格式中catch语句块可以出现多次
try...catch...finally处理方式,既可以处理编译时异常,也可以处理运行时异常
Throwable中的常见方法
String getMessage():获取异常出现的原因
String toString():获取异常的类型(异常的全类名),加上异常出现的原因
void printStackTrace():打印异常的详细信息,异常的类型、异常的原因和异常出现位置
该方法是JVM底层默认处理异常打印异常信息的方式
自定义异常
如何定义
(1)自定义一个类,继承Exception或者RuntimeException
如果继承Exception,那么就是自定义的编译时异常
如果继承RuntimeException,那么就是自定义的运行时异常
(2)生成两个构造方法
一个空参构造
一个带一个字符串参数的构造方法,用于传递异常的原因
如何使用
JDK提供的异常类如何使用,自定义的异常类也如何使用
如果是编译时异常在编译时期必须处理,可以throws也可以try...catch
如果是运行时异常在编译可以不处理,也可以处理,使用try...catch处理
多线程
进程:正在执行的软件(应用程序),占用内存和CPU资源
线程:是进程中的一条执行路径,一个进程可以包含多条线程
一个进程至少包含一条线程,如何没有线程那么进程也会随之结束
创建线程的方式
方式一:继承Thread类
步骤:
(1)自定义一个类继承Thread类,自定义类就变成了一个线程类
(2)重写Thread类中的run方法
run方法中就是线程执行的代码
@override
public void run() {
}
(3)在测试类中,创建自定义的对象
(4)启动线程,调用start()方法
start方法做两件事:
a:启动线程
b:调用run方法
// (1)自定义一个类继承Thread类,自定义类就变成了一个线程类
public class MyThread extends Thread {
(2)重写Thread类中的run方法
public void run() {
for(int i = 0; i< 100 ;i++){
System.out.println("helloworld!"+i);
}
}
}
// 测试类
public class Test {
public static void main(String[] args){ // main
// (3)在测试类中,创建自定义的对象
MyThread mt = new MyThread(); // Thread-0
// (4)启动线程,调用start()方法
mt.start();
MyThread mt2 = new MyThread();// // Thread-1
mt2.start();
}
}
方法二:实现Runnable接口
今日重点
异常
能说编译时异常和运行时异常的区别
能够使用两种异常处理方式(throws和try...catch)处理异常
能够自定义异常并使用
多线程
熟练掌握线程的实现方式一的代码编写