异常、线程入门

目录

 

一、异常

1.什么是异常

2.异常的继承体系

3.异常类中常用的三个方法

4.异常的分类

二、异常处理

1.抛出异常关键字throw

2.Objects类中提供的非空判断方法(*********)

3.遇到异常的两种处理方式

4.catch代码块中三种常见的处理方式

5.多个异常如何获取处理

6.finally代码块

7.异常的注意事项

三、自定义异常

1.自定义异常的步骤

2.自定义异常的练习

四、多线程

1.并行和并发

2.进程和线程


一、异常

1.什么是异常

指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。

在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

2.异常的继承体系

Throwable体系:

Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。

Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行, 是必须要处理的。好比感冒、阑尾炎。

3.异常类中常用的三个方法

public void printStackTrace() :打印异常的详细信息。包含了异常的类型,异常的原因,还包 括异常出现的位置,在开发和调试阶段,都得使用 printStackTrace。

 

public String getMessage() :获取发生异常的原因。提示给用户的时候,就提示错误原因。

 

public String toString() :获取异常的类型和异常描述信息(不用)。

4.异常的分类

(1)编译时异常

在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)

(2)运行时异常

在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)

二、异常处理

1.抛出异常关键字throw

语法:throw new 异常类名(参数);

2.Objects类中提供的非空判断方法(*********)

public static <T> T requireNonNull(T obj) {

if (obj == null)

throw new NullPointerException()  ;

return obj;

}

每个方法 只要参数是引用类型,一定要进行非空判断

3.遇到异常的两种处理方式

(1)throws抛出异常

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }

(2)try...catch捕获异常

try{

编写可能会出现异常的代码

}catch(异常类型 e){

处理异常的代码

//记录日志/打印异常信息/继续抛出异常

}

4.catch代码块中三种常见的处理方式

(1)记录日志(log4j)

(2)打印异常信息

(3)继续抛出异常

5.多个异常如何获取处理

(1)多个异常分别处理。

(2)多个异常一次捕获,多次处理。

(3)多个异常一次捕获一次处理。

try{

编写可能会出现异常的代码

}catch(异常类型A e){ try中出现A类型异常,就用该catch来捕获.

处理异常的代码

//记录日志/打印异常信息/继续抛出异常

}catch(异常类型B e){ try中出现B类型异常,就用该catch来捕获.

处理异常的代码

//记录日志/打印异常信息/继续抛出异常

}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

6.finally代码块

try...catch....finally:自身需要处理异常,最终还得关闭资源。

当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行。 比如System.exit(0);

7.异常的注意事项

(1)运行时异常被抛出可以不处理。即不捕获也不声明抛出。

(2)如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。(比如:如果父类抛出5个异常,子类                      只能抛出0-5个和父类相同的异常)

(3)父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出

(4)当多异常处理时,捕获处理,前边的类不能是后边类的父类

(5)在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。

(6)如果finally有return语句,永远返回finally中的结果,避免该情况.

三、自定义异常

1.自定义异常的步骤

(1) 自定义一个编译期异常: 自定义类 并继承于java.lang.Exception 。

(2)自定义运行时期的异常类:自定义类 并继承于java.lang.RuntimeException 。

(3)必须有两个构造方法。(无参构造和String参数构造)

2.自定义异常的练习

public class MyException extends Exception {
    public MyException() {

    }

    public MyException(String message) {
        super(message);
    }
}

四、多线程

1.并行和并发

并行:两个事件在同一时刻同时进行

并发:两个事件在同一时间段内同时进行

2.进程和线程

进程:正在运行的程序

线程:完成进程中的某个任务

 

进程和线程之间的一些区别:

进程拥有独立的栈和堆

线程拥有独立的的栈和共享堆

 

线程调度

单核CPU,同一时刻,只能执行一个线程

CPU在多个线程之间进行快速切换

调度的两种方式:

(1)分时调度:平均分配时间片 所有线程轮流使用CPU

(2)抢占式调度:CPU在多个线程之间随机切换

Java采用抢占式调度

Java进程中默认至少有两条线程,main线程和垃圾回收线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值