异常
异常: 指的是程序在执行过程中,出现的非正常的情况,最终会导致jvm的非正常停止.
在java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象,java处理异常的方式就是中断处理
注:异常指的并不是语法错误,语法错误,编译不会通过,不会生成字节码文件,根本不能运行。
注意事项:
(1) 在java中,每种异常都有对应的类来描述,发生了一个异常,就是出现了这个类的对象
(2) 异常不是语法错误
1.1.异常的体系结构
java.lang.Throwable (是java语言中所有错误和异常的根类) // 体系最顶层
其下有两个子类:Error(错误)
Exception(异常)q
平常所说的异常指:Exception
1.2. 异常子类说明
Error (子类1.表示错误):
严重错误,不应该试图捕获的严重问题,不能处理的错误,必须修改源代码,程序才可以继续执行
Exception(子类2.表示异常):
可以处理的异常,编译(写代码)时期的异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的.
Throwable中的常用方法:
(1) printStackTrace();
说明: 打印异常的详细信息.其中包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace.
(2) getMessage();
说明: 获取发生异常的原因.提示给用户的时候,就提示错误原因
(3) toString();
说明: 获取异常的类型和异常描述信息(不用).
1.3.异常分类
前言: 我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序.
异常(Exception)的分类:根据在编译时期还是运行时期去检查异常.
(1) 编译时期异常: checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
(2) 运行时期异常: runtime异常。在运行时期,检查异常.在编译时期,运行异常不会被编译器检测(不报错)。(如数学异常)
二 异常的处理
Java异常处理的五个关键字: try \ catch \ finally \ throw \ throws
throw:
含义:抛出异常
类型: 关键字
在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。
抛出异常具体操作:
1. 创建一个异常对象.封装一些提示信息(信息可以自己编写).
2. 需要将这个异常对象告知给调用者.
注: throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行.后面的代码语句将不再执行.
使用格式:
throw new 异常类名(参数);
注意事项:
1. 如果产生了问题,我们就会throw将问题描述类(即异常)进行抛出,也就是将问题返回给该方法的调用者.
2. 调用者的处理方法分为两种:
2.1: 进行捕获处理
2.2: 继续将问题声明出去,使用throws声明处理(在方法中)
2.2 Objects非空判断
Objects:由一些静态的实用方法组成
2.3 声明异常throws
含义: 将问题标识出来,返回给调用者.如果方法内通过throw抛出了编译时异常,而没有捕获处理(2.4讲解),那么必须通过throws进行声明,让调用者去处理.
意义:关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).
2.4 捕获异常try...catch
如果异常出现的话,会立刻终止程序,如果不想程序终止,所以我们得处理异常:
1. 该方法不处理,而是只声明抛出,那么就由该方法的调用者来处理(throws).
返回给main总方法,然后main方法返回给JVM,由JVM进行处理.疑问2:???
说明: 在方法中出现一个异常,通常处理的方式有两种:
1. 用try catch方法捕获,自己在方法内部进行解决.
2. 向上抛出异常,在返回给main总方法的时,也是有相同的两种选择.如果垂直向上返回直到main方法,最终就交给JVM来处理这个异常.
二. 在方法中使用try-catch的语句块来处理异常.
try-catch的作用就是捕获异常.
捕获异常: Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理.
try : 该代码块中编写可能产生异常的代码.
catch: 用来进行某种异常的捕获,实现对捕获到的异常进行指定方式的处理.
疑问1: ???
解决: catch()中的"异常类型 e" 相当于一个新建变量值接收了出现异常代码的数据,所以 1. 数据类型要保持一致
2. e 的写法不是固定不变的,没有特殊含义,和任何自定义的变量名一样
线程
线程
1.1 并发与并行:
并行: 指两个或多个事件在同一时刻发生(同时发生).
并发: 指两个或多个事件在同一个时间段内发生.
并行为同时进行.
并发为交替运行.
1.2 并发和并行在操作系统中的说明:
操作系统中,在安装了多个程序的前提下:
1.并发指的是在一段时间内(同一个时间段)宏观上有多个程序同时运行.
单CPU系统中: 每一时刻只能有一道程序运行,即微观上这些程序是分时(非同时)的交替运行. 只不过分时交替运行的速度非常快,耗费的时间非常短,所以给人的感觉像是在同时运行的.
多CPU系统中: 这些可以并发进行执行的程序便可以被分配到多个处理器(CPU)上,真正实现多任务并行(同时)执行. 即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行.
小提示: 目前电脑市场上说的多核CPU,便是多核处理器.核越多,并行同时处理的程序就越多,可以大大地提高电脑运行的效率.
1.3 线程与进程:
进程: 是指在一个内存中运行的应用程序.每个运行的应用程序都在内存中拥有一个独立的内存空间. 一个应用程序可以同时运行多个进程,进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创
建、运行到消亡的过程。
线程(Thread): 进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。
进程与线程的区别:
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。
1.4 创建线程类
线程(Thread): 所有的线程对象都必须是Thread类或者其子类的实例.
每个线程的作用是完成一定的任务,实际上就是执行一段程序流(即一段顺序执行的代码). Java使用线程执行体来代表这段程序流.
JAVA中通过继承Thread类来创建并启动多线程的步骤如下:
1.定义Thread类的子类,并重写该类的run()方法,该run方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体.
2.创建Thread子类的实例,即创建了线程对象.
3.在测试类Main总方法中调用线程对象的start方法来启动该线程.