一、上节课回顾
异常Exception
1、概念:在程序运行的时候,代码产生的不正常事件,导致程序无法正常的继续执行。
理解它:代码写的不正常,跑不下去了。。。
2、程序的执行流程:
step1:JVM创建主线程,调用main(),程序的入口
step2:按照main中的代码,从上向下执行。。。
step3:main中的内容全部执行完毕,程序正常结束。。JVM退出
3、如果在程序的执行过程中,产生异常了,比如除0,null的对象调用方法,父类对象强制转为子类类型。。。由JVM负责创建一个该类型的异常对象,并抛出,从而打断程序的执行。
理解:程序不正常,导致执行不下去了,通过异常对象来阻止进一步执行。。
4、异常的分类:
错误:Error,系统级别的问题,程序解决不了。
异常:Exception,
受检异常:编译器在编译程序的时候,检查出来的异常。程序中必须处理该异常,程序才能正常的执行。
外部因素导致的异常。
FileNotFoundException,文件找不到异常
IOException,IO操作异常
SQLException,SQL操作异常
ParseException,解析异常
。。。
非受检异常:编译器编译程序的时候,不检查。运行的时候可能产生的异常,程序中不要求一定处理。也叫做运行时异常:RuntimeException
代码中的逻辑问题导致的异常
ArrayIndexOfBoundsException,数组下标越界异常
StringIndexOutOfBoundsException,字符串下标越界异常
ArithmeticException,算术异常
NullPointerException,空指针异常
ClassCastException,类转型失败异常
5、异常的处理
A:捕获:将异常处理在捕获的代码中。
intn=10;
try{
//可能产生异常的代码
//10行:5行产生异常,结束这个try,跳入对应的catch中
}catch(异常类型1e){
//处理异常
e.printStack();//打印:异常类型,异常的原因,哪行产生的。。。
}catch(异常类型2e{
}finally{
//无论try语句中,是否产生异常,此处的代码一定会被执行。
//惯用于做最后的清理工作:断开资源链接,删除临时文件。。。
}
B:抛出:方法声明上,声明该方法不处理异常,一旦产生异常了,交给调用处进行处理。
throws关键字:用于声明方法抛出异常
publicstaticvoid/返回值方法名(参数列表)throws异常类型1,异常类型2...{
//方法体;
}
//调用处:
方法名(实参);//就要处理这个异常:可抓,可抛
JVM-->main()-->test1()-->test2()-->test3()....
编码习惯上:
try...catch语句:try语句块中的代码越少越好。
throws...功能方法:main()不要再throws异常了。
二、本节课内容
2.1、throws关键字
用于一个方法的对外声明:用于表示该方法不处理异常,交由调用处进行处理。
publicstaticvoidtest()throwsParseException{
}
子类重写父类的方法时,不能抛出比父类更大的异常。
父类抛出异常,子类可以不抛出
父类抛出异常,子类可以抛出和父类一样的或者是比父类小的异常
父类抛出异常,子类不能抛出比父类更大的异常
父类没有抛出异常,子类也不能抛出异常。
2.2、throw关键字
用于代码中主动抛出一个异常对象:设计一个方法的功能的时候,根据逻辑分析,可以主动抛出一个异常对象。
代码级别上,主动抛出一个异常对象,提示调用者:产生问题啦。。
以下是String这个类的源代码:
publiccharcharAt(intindex) {
if((index<0)||(index>=value.length)) {
thrownewStringIndexOutOfBoundsException(index);
}
returnvalue[index];
}
【面试题】对比Exception和RuntimeException的区别。
1、Exception是最大的异常父类。RuntimeException是Exception的子类。
2、RuntimeException是运行时异常,程序不强制一定处理该类型的异常。Exception的异常,包含了受检异常,程序中必须处理该类型的异常。
【面试题】对比throws和throw的区别。
1、throws关键字,用于表示一个方法向外声明,该方法不处理异常,交由调用处处理这个异常。处理异常的一种方式:捕获,抛出。
2、throw关键字,代码中,主动抛出一个异常对象。因为某个逻辑原因,主动抛出一个异常对象,打断程序的执行。主动抛出异常对象。
Collection和Collections
Array和Arrays
2.3、自定义异常
了解性内容:理论知识能够懂。
自己定义一个类,用于表示某种异常。需要继承Exception或其子类即可。
问题:不是哪个类的对象,都有被创建并抛出就能够打断程序的功能。
自定义异常:
classMyExceptionextendsException{
//提供有参构造方法。。
publicMyException(Stringmsg){
super(msg);//调用父类的有参构造:提供异常的信息
}
publicMyException(){
super();//父类的无参构造,没有提供异常的信息
}
}
程序中主动抛出一个异常对象:
/*
* 设计一个方法,用于检验年龄,年龄不合法,抛出一个异常
*/
publicstaticvoidcheckAge(intage)throwsMyException{
if(age<0){
// return;
thrownewMyException("年龄不能为负数。。");
}
System.out.println("年龄输入正确,请继续。。。");
}
return和finally的参考资料:
https://blog.csdn.net/zoujian1993/article/details/45362931
2.4、多线程
2.4.1 生活中的多任务
生活中,有很多的场景下,同时干多件事儿。比如开车:同时时候手和脚。做作业同时听课。泡健身房跑步,听音乐。。。
舞台表演:边唱边跳。
2.4.2 windows电脑
windows电脑,打开任务管理器,发现电脑中正在执行的程序,有多个。每个程序叫就叫做一个进程。
windows电脑可以同时执行多个程序?那是因为CPU太快啦。。
2.4.3 并行和并发
串行:任务一个接一个做。
并行:同时在做多个任务。(硬件的支持)
并发:在多个任务之间快速的切换,看起来同时执行多个任务。但是实际上,某一个事件点,执行1个任务。
宏观并行,微观串行。
2.4.4 进程
进程:就是正在执行的程序。占用系统资源。
一个程序的执行,内存,CPU。。。
注意区分:电脑上安装的软件。没有跑起来,不能算进程。
2.4.5 线程
何为线程:概念:进程中的一个执行路径。
进程:一个正在执行的程序。
Word文档:--->一个进程
首字母大写--->一个线程
检查拼写错。。--->一个线程
。。。。
2.4.6 进程和线程
1、进程:一个正在执行的程序:JVM正在执行的程序
2、线程:正在执行的程序中的一条执行路径
3、多线程:一个进程中,可以同时有多条线程一起执行。
如果一个进程没有了,该进程中的线程也就没有了。
如果线程没有了,但是进程不一定的。
2.4.7 Java中对于多线程的支持
Java中如何实现多任务的?多线程
Thread类:JDK提供好的,Thread类,就是java中关于多线程的实现。线程的功能都封装在了该类中。
要使用线程,来实现程序的并发:一个程序,同时干多件事。
比如:唱歌,同时跳舞
Thread类来实现
Java代码,如何创建一条线程?如何启动起来?执行功能?
两种创建线程的方式
A:创建线程并启动:继承Thread类
step1:创建子类,继承Thread类。
step2:重写run(),线程体。并发执行的内容,写在这个方法中。
step3:启动线程:start()
/*
class Cat
class Person
class MyException extends Exception{//异常类
}
class MyThread extends Thread{//线程类
}
*/
B:实现Runnable接口,创建线程的方式二
step1:创建实现类,实现Runnable接口
step2:重写run(),线程体。并发执行的内容,写在这个方法中。
step3:启动线程:
创建实现类的对象:mt
根据实现类对象mt,创建Thread类对象t3,t4
start()启动该线程:t3,t4
对比run()和start()
run(),是线程体。就是要并发执行内容。
start(),启动一个线程?就是该线程准备就绪了,随时可以被CPU执行。什么时候执行,CPU自己说了算。
一个线程,只能被start一次。
Thread类的构造方法
new Thread();//并发执行,执行run()方法。
new Thread(Runnable target);//并发执行,执行的run是Runnable接口的实现类实现run方法