01.第一章:异常_概念及异常处理的作用:
1).什么是“异常”:是指代码在执行过程中,出现了一些JVM无法处理的数据,一旦出现这种情况,JVM将会终止程序的执行(程序卡死,程序闪退),这种情况就叫:异常。
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数:");
int a = sc.nextInt();
System.out.println("请输入第二个数:");
int b = sc.nextInt();
System.out.println(a + " / " + b + " = " + (a / b));
}
}
2).如果程序一旦出现异常情况,我们程序员和用户都不希望程序被终止。这时Java提供了一种语法--异常处理机制,可以在“异常情况”出现时,使我们的程序可以继续健康的运行下去。
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数:");
int a = sc.nextInt();
System.out.println("请输入第二个数:");
int b = sc.nextInt();
try {
System.out.println(a + " / " + b + " = " + (a / b));
} catch (ArithmeticException e) {
System.out.println("运算时出现错误了,但程序没有死,我可以继续健康的运行下去!");
}
System.out.println("后续代码....");
}
}
02.第一章:异常_异常产生的过程解析:
1).JVM执行到有异常的代码;
2).JVM识别出这个异常;
3).JVM到类库中找到描述这个异常情况的“异常类”,并创建对象;
4).判断我们的程序是否有catch语句来捕获这个异常:
有:执行这个catch语句,之后,继续向下运行;
无:将异常信息打印到控制台,将程序结束;(这是我们不希望看到的)
03.第一章:异常_Java异常体系结构及分类:
这里讲的“异常”全部是指:程序已通过编译,在运行时出现的异常。
Throwable(顶层的异常类):
|--Error(错误):不希望我们程序捕获的一些重大异常。(不用掌握)
|--Exception(异常):希望程序进行捕获的一些异常情况(必须掌握)
|--RuntimeException(运行时异常):
|--除RuntimeException外的其它异常(编译期异常):不是“编译时的语法错误”。指这种异常必须要“处理”,否则无法编译通过。(这跟写代码时的语法错误是不同的。)
SimpleDateFormat sdf = new SimpleDateFormat(...);
sdf.parse("2018-09-11");//这个方法会抛异常,我们必须处理这个异常,否则编译不能通过异常类的作用:
1).每个异常类,都描述了一种异常情况;
2).异常类的“类名”就指出了这个异常是什么情况;类内部还包含了一个String类型的变量,用于存储此种异常的“异常信息”,还有一些方法可以做一些其它操作。
04.第二章:异常的处理_基本方式try…catch语句及执行流程:
1).基本语句:
try{
//可能出现异常的代码:
}catch(异常类名 变量名){
//如果出现了跟“异常类名”匹配的异常,将会执行这个catch.
//执行完毕,将会继续执行catch的后续语句,程序就起死回生了。
}
2).示例代码:
1).无异常情况的执行流程:
2).有异常的执行流程:
3).说明:
1).catch中的“异常类型”必须和try中产生异常的类型匹配,才能被执行,否则不能被执行;
public static void main(String[] args) {
try {
System.out.println("a");
System.out.println("b");
int i = 10 / 0;
System.out.println("c");
System.out.println("d");
} catch (NullPointerException e) {//try中产生的是“算术运算异常”,catch的是“空指针”异常,不匹配,所以catch不会被执行;
System.out.println("e");
}
System.out.println("f");
}
05.第二章:异常的处理_常见的几种异常:
1).空指针异常:
try{
int[] arr = null;
System.out.println(arr.length);
}catch(NullPointerException e){
...
}
当一个“引用类型”是“null”时,不能访问它的任何属性、方法,否则会抛出空指针异常:NullPointerException.
Throwable:
|--Exception:
|--RuntimeException
|--NullPointerException
2).数组下标越界异常:
try{
int[] arr = {1,2};
System.out.println(arr[10]);
}catch(ArrayIndexOutOfBoundsException e){
....
}
Throwable:
|--Exception:
|--RuntimeException:
|--IndexOutOfBoundesException:
|--ArrayIndexOutOfBoundsException
3).数字转换异常:
try {
String strAge = "22a";
int age = Integer.parseInt(strAge);
System.out.println(age);
}catch(NumberFormatException e){
...
}
Throwable
|--Exception
|--RuntimeException
|--IllegalArgumentException
|--NumberFormatException
4).算术运算异常:
try{
int a = 10 / 0;
}catch(ArithmeticException e){
...
}
Throwable:
|--Exception:
|--RuntimeException
|--ArithmeticException
5).转换异常:
try{
String strDate = "2018-01-01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse(sdf)://此方法会抛出ParseException
}catch(ParseException e){
....
}
Throwable
|--Exception
|--ParseException
06.第二章:异常的处理_try…catch…catch…语句及执行流程:
try{
//多行代码,可能会产生多种异常
}catch(异常类型1 变量名){
}catch(异常类型2 变量名){
}catch(异常类型n 变量名){
}
1).示例代码,及执行流程:
1).无异常情况:
2).有异常情况:
3).其它说明:
1).多catch中的异常类型不能是相同的类型,否则编译错误;
2).多catch中的异常类型“可以是子父关系”,但“父类的异常类型”必须写在多catch的末尾:
try{
}catch(ArithmeticException e){
}catch(NullPointerException e){
}catch(Exception e){
}
3).多catch中的异常类型如果是“平级”关系,没有顺序。
07.第二章:异常的处理_声明抛出异常throws【常用】:
1).注意:
1).throws用于在“方法声明”处,声明抛出异常;
2).throws后面可以写多个“异常类型”名,用,号隔开;
3).如果方法内产生了声明的异常类型之一,JVM会立即终止方法的执行,并将异常对象返回给“方法调用处”。
4).如果声明抛出的是“运行时异常(RuntimeException)”调用时,可以不处理;
5).如果声明抛出的是“编译期异常(除RuntimeException外的异常)”,调用处必须将这个异常捕获(try...catch..)或者继续抛出(throws)
08.第二章:异常的处理_抛出异常throw:
1).注意:
1).throw表示:抛出一个异常对象;后面必须new一个异常对象;
2).throw表示结束方法的执行,立即返回一个异常,后续代码不会被执行;
08.2.第二章:异常的处理_throws和throw的区别:
09.第二章:异常的处理_Objects类的非空判断:
class Student{
private String name;
private int age;
public Student(String name,int age){
//自己验证
/*
if(name == null){
throw new NullPointerException("名字不能为null");
}
this.name = name;
*/
//使用Objects的requireNonNull()方法代替
this.name = Objects.requireNonNull(name);
}
...
}
main(){
Student stu = new Student(null,18);
}
10.第二章:异常的处理_try…catch…finally语句:
例如在一个方法中,某些情况下,try语句中就要return 值;
例如:读取文件内容:
public static String readFile(){
try{
打开文件流
读取文件;//假如这里出现异常
return 文件内容;
}catch(异常类型 e){
....
}finally{
//无论是否出现异常都会被执行的代码
关闭文件流
}
return null;
}
示例代码:
public class Demo {
public static void main(String[] args) {
p1();
}
private static int p1() {
try {
int a = 10 / 0;
System.out.println("a");
return 10;
} catch (ArithmeticException e) {
System.out.println("b");
return 20;
}finally {
System.out.println("c");
}
}
}
11.第三章:自定义异常_概述:
1).有些时候我们的程序会根据需求,可能需要产生一些类库中没有的异常,例如:
class Student{
private int age;
public void setAge(int age){
if(age < 15 || age > 5){
throw new 自定义异常对象();
}
this.age = age;
}
}
2).制作自定义异常类:
1).自定义类继承自:Exception或者它的某个子类即可(注意区分运行时和非运行时)
2).添加一个带String参数的构造方法,用于指定“异常信息”
3).例如:定义自定义异常类:
class AgeException extends Exception{
public AgeException(String msg){
super(msg);
}
}
4).使用:
class Student{
private int age;
public void setAge(int age){
if(age < 15 || age > 5){
throw new AgeException("年龄必须在15到50之间");
}
this.age = age;
}
}
5).测试:
main(){
Student stu = new Student();
try{
stu.setAge(18);
}catch(AgeException e){
System.out.println(e.getMessage());
}
}
12.第三章:自定义异常_自定义异常练习:
见11
13.第四章:多线程_进程与线程:
1).什么是“进程”:它是“操作系统”的概念,指一个独立运行的程序;由自己独立的内存空间;
2).什么是“线程”:它是由“进程”创建的,可以使一个“进程”中的一些代码独立出来,与“主进程”同时执行,可以使程序的两部分代码“同时”执行,可以提高程序的执行效率。
14.第四章:多线程_并发与并行:
1).什么是“并发”:早期针对“CPU”来说,单颗CPU处理多个进程同时访问时,
这时CPU就收到了“并发”性访问。
2).什么是“并行”:例如:两颗CPU同时处理两个进程,这种情况叫:并行;
15.第四章:多线程创建线程类继承Thread及匿名对象的方式:
1).我们之前的程序都是“单线程”程序;以后制作的WEB程序就都是多线程的了。
2).多线程程序好处:可以“同时”做多件事情。可以提高程序的运行效率,也可以提高用户的体验度;
3).怎么制作多线程程序:
1).自定义线程类,继承自:Thread
2).重写run()方法:在线程中做的事情写在这里;
3).启动线程:
1).创建一个自定义线程类对象;
2).调用线程对象的start()方法启动线程;
注意:启动线程是start(),线程启动后执行的是run();
4).示例代码:
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
}
}
public class Demo {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start();
for (int k = 0; k < 100; k++) {
System.out.println("k = " + k);
}
}
}
5).匿名子类的方式:
//匿名子类对象
Thread t1 = new Thread(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
}
};
t1.start();
for (int k = 0; k < 100; k++) {
System.out.println("k = " + k);
}
16.第四章:多线程创建线程类关于线程的几个说明:
1).启动线程是start(),启动后,线程执行的是run()方法;
2).一个线程对象,不能多次的start(),只能启动一次;
总结:
01.能够辨别程序中异常和错误的区别
1).错误:程序无法处理的异常情况–堆栈溢出;
2).异常:程序可以处理的一些异常情况;
02.说出异常的分类
Throwable
|–Error
|–Exception(异常)
|–RuntimeException(运行时异常)
|–除RuntimeException外的其它异常:编译期异常;
03.说出虚拟机处理异常的方式
1).执行异常的代码;
2).识别出异常;
3).到类库中找到这个异常类,并创建对象;
4).判断代码中是否catch这个异常:
是:执行catch语句;
否:打印到控制台,结束程序;
04.列举出常见的三个运行期异常
1).数组下标越界:ArrayIndexOutOfBoundesExceptio
2).空指针:NullPointerException
3).算术运算错误:ArithmeticException
05.能够使用try…catch关键字处理异常
int[] arr = {1,2};
try{
System.out.println(arr[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(“异常了”);
}
06.能够使用throws关键字处理异常
public void show() throws NullPointerException{
}
07.能够自定义异常类
class AgeException extends Exception{
public AgeException(){
}
public AgeException(String msg){
super(msg);
}
}
08.能够处理自定义异常类
1).使用自定义异常
class Student{
…
public void setAge(int age) throws AgeException{
if(age < 15 || age > 50){
throw new AgeException(“年龄错误!”);
}
}
}
2).处理自定义异常:
main(){
Student stu = new Student();
try{
stu.setAge(10);
}catch(AgeException e){
}
}
09.说出进程的概念
是指一个内存中运行的应用程序,
10.说出线程的概念
进程内部的一个独立执行单元; 一个进程可以同时并发的运行多个线程
11.能够理解并发与并行的区别
并发: 指两个或多个事件在同一个时间段内抢占一个共同的资源。
并行: 指两个或多个事件在同一时刻发生(同时发生) ,占用各自的资源;
12.能够开启新线程
1).制作新线程:
class MyThread extends Thread{
public void run(){
for(int i = 0;i <100 ; i++){
System.out.println(“i = ” + i);
}
}
}
2).启动线程:
main(){
MyThread t1 = new MyThread();
t1.start();
MyThread t2 = new MyThread();
t2.start();
}