异常
概述:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常运行
注意:
- 在java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。java处理异常的方式是中断处理。
- 异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行
异常的体系:
Throwable异常的顶层类,是java语言中所有错误或异常的父类
Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症
例如:内存泄漏,数据库崩溃
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的,
异常的分类:
编译异常:在编译期间出现的异常,编译异常如果编译期间不处理,是通不过编译的
除了RuntimeException及其子类都是表示的编译异常
运行异常:在运行期间出现的异常,运行异常如果编译期间不处理,可以通过编译的 RuntimeException及其子类都是表示运行异常
异常的产生过程解析:
- 创建异常对象,封装异常的信息
- throw抛出异常
- JVM接收异常,并发送异常到控制台,终止程序运行
java异常处理的五个关键字:try、catch、finally、throw、throws
throw关键字
概述:在java中,提供一一个throw关键字,它用来抛出一个指定的异常对象
格式:
throw new 异常类名(参数);
位置:
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行
throws关键字
第一种处理异常的方式:声明处理异常
声明异常:将问题标识出来,报告给调用者。
如果方法内通过throw抛出了编译时异常而没有捕获处理,那么必须通过throws进行声明,让调用者去处理
关键字throws运用于方法声明 之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)
声明异常格式:
修饰符 返回值类型 方法名(参数)throws 异常类名1,异常类名2…{ }
注意事项:
- throws用于进行异常类的声明,若该方法可能有多重异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开
- 如果方法需要使用throws抛出多个异常来处理异常,假设这多个异常是父子类关系,那么就可以直接抛父类异常
try…catch
捕获异常:java中对异常有针对性的语句进行捕获,可以堆出现的异常进行制定方式的处理
格式:
try{
编写可能出现异常的代码
}catch(异常的类型 变量名){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
注意:
- try和catch都不能单独使用,必须连用
- 如果try中的代码出现了异常,那么try中出现异常位置后面的代码就不会执行了
- 如果try中的代码出现了异常,程序还是会继续往下执行,如果throws抛出异常的方式处理异常,出现异常之后会终止程序的运行
- 如果try中的代码出现了异常,那么就会执行catch中的代码,如果try中的代码没有出现异常,那么就不会执行catch后面的代码,不管try中是否出现异常,程序都都会继承往下执行
Throwable类中定义了一些查看方法
public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
public String toString() :获取异常的类型和异常描述信息(不用)。
public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台。
多个异常使用捕获又该如何处理呢?
- 多个异常分别处理
- 多个异常一次捕获,多次处理
- 多个异常一次捕获,一次处理
finally关键字
概述:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行 不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
格式:
try{
编写可能出现异常的代码
}catch(异常的类型 变量名){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}finally{
//正常情况永远都会执 一般写释放资源的代码
}
异常注意:
- 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
- 如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
- 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
- 当多异常处理时,捕获处理,前边的类不能是后边类的父类
- 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
- 如果finally有return语句,永远返回finally中的结果,避免该情况.
并行:指两个或多个事件在同一时刻发生(同时发生)
并发:指连个或多个事件在同一个时间段内发生
线程:其实就是进程的最小可执行单元
进程:其实就是应用程序可执行单元,.exe文件
结论:一个应用程序可以有多个进程,一个进程可以有多条线程
注意 :一个java程序就只有一个进程,而一个进程一次只能执行一条线程,所以在java中只有多线程并发
线程调度:随机调度,JVM采用的是抢占式调度,没有采用分时调度, 因此可以能造成多线程执行结果的的随机性。
多线程并行:多条线程同时执行
多线程并发:多条线程同时请求执行,但是CPU一次只能执行一个线程,所以只能随机交替执行,这个就是多线程并发