java异常和线程.docx
- 文档编号:27347448
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:20
- 大小:19.75KB
java异常和线程.docx
《java异常和线程.docx》由会员分享,可在线阅读,更多相关《java异常和线程.docx(20页珍藏版)》请在冰豆网上搜索。
java异常和线程
第九部分异常处理和断言
一.几种运行时的异常
1.空指针异常NullpointerException,即调用不存在的对象或者没有初始化的对象
2.超出排序发范围的异常indexOutOfBoundsException,
包括:
ArrayOutOfBoundsException和StringOutOfBoundsException
3.错误类型转换异常ClassCastException异常
4.数学运算异常ArithmeticException异常
二.异常处理方法
1.try..catch语句捕获
例子:
publicclassTest1{
publicstaticvoidmain(Stringargs[]){
Test1t=newTest1();
t.divide(0);
}
voiddivide(inti){
inty=10;
try{
System.out.println(y+"/"+i+"=");
inta=y/i;
System.out.print(a);
}catch(ArithmeticExceptione){
System.out.println("捕获ArithmeticException");
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace();
}
}
}
运行结果:
10/0=
捕获ArithmeticException
/byzero--getMessage()获得异常的详细信息
java.lang.ArithmeticException:
/byzero--toString()返回对Throwable的说明
java.lang.ArithmeticException:
/byzero
atTest1.divide(Test1.java:
11)--printStackTrace()返回异常发生时执行堆栈内容
atTest1.main(Test1.java:
5)
2.使用多个try..catch
3.带有finally的try..catch语句
不管异常是否发生,finally后面的语句都会发生,应该注意的问题:
一般特定的操作要放到finally中,比如:
打开文件,关闭数据库连接等;
Catch语句中,出现异常后面的部分将不会继续执行;
例子:
publicclassTest1{
publicstaticvoidmain(Stringargs[]){
Test1t=newTest1();
System.out.println("调用divede
(2)返回的结果为:
"+t.divide
(2));
}
intdivide(inti){
inty=10;
try{
System.out.println(y+"/"+i+"=");
inta=y/i;
returna;
}catch(ArithmeticExceptione){
System.out.println("捕获ArithmeticException");
e.printStackTrace();
}finally{
System.out.println("itisthefinally语句");
}
returny;
}
}
运行结果:
10/2=
itisthefinally语句
调用divede
(2)返回的结果为:
5
解析:
Finally语句是按照顺序执行的;
有时候直接使用就是try..finally就是为了保证即使发生异常,也要使finally代码执行;
4.嵌套try..catch
内层try块发生异常时,首先由内层catch捕获,如果没有捕获到,则由外层catch继续捕捉;
5.throw关键字抛出异常
如果程序中有方法A()需要调用一个声明了异常的方法,那么这个方法A()也需要对异常进行处理:
抛出或者捕捉
例子:
6.自定义异常
用户自定义的异常类必须是继承一个现有的异常类
例子:
publicclassMyExceptionextendsException{
privateStringstr;
publicMyException(){
}
publicMyException(Stringmessage,Stringstr){
super(message);
this.str=str;
}
publicStringgetStr(){
returnstr;
}
publicstaticvoidmain(Stringargs[]){
MyExceptionme=newMyException();
try{
pareLength("java");
pareLength("theprogramme");
}catch(MyExceptione){
System.out.println(e.toString()+e.getStr());
}catch(Exceptione){
System.out.println(e.toString());
}
}
publicvoidcompareLength(Strings)throwsMyException{
if(s.length()<10){
System.out.println(s);
}else{
thrownewMyException("字符长度超过10",s);
}
}
}
运行结果:
java
MyException:
字符长度超过10theprogramme
解析:
7.异常的使用原则
捕获了异常就要对其进行处理,如果不处理,捕获也没有用处了;
应该在程序中尽量捕获课程出现的异常,不使用Exception,要具;体
不要每句都是用Try..catch语句,尽量多使用catch;
使用finally释放占有的资源
8.断言
publicclassAssertTest{
//获取工资
publicdoublegetSalary(doubled){
assert(d>0):
"输入为:
"+d+"该值不能小于0";
if(d<=1000){
System.out.println("MID");
}else{
System.out.println("HIGH");
}
returnd;
}
publicstaticvoidmain(Stringargs[]){
AssertTestast=newAssertTest();
ast.getSalary(-10);
}
}
解析:
第十部分多线程
一、基础知识理
如果一个程序中的多段代码需要在一个时间段内同时运行,就需要使用多线程;
所谓进程,当运行一个程序时,就会运行一个进程;
线程的生命周期:
新建、就绪、运行、阻塞(等待、同步、其他)、结束;
二、实现多线程的方法
两种方法:
继承java.lang.Thread和实现java.lang.Runnable
(1)继承java.lang.Thread类的子类,必须重写run()方法,并且通过调用Thread类中的start()方法
例子:
publicclassThreadTestextendsThread{
StringThreadName;
ThreadTest(String_ThreadName){
ThreadName=_ThreadName;
}
publicvoidrun(){
for(inti=1;i<5;i++){
System.out.println(ThreadName+"["+i+"]");
}
}
publicstaticvoidmain(Stringargs[]){
newThreadTest("Thread1").start();
newThreadTest("Thread2").start();
}
}
运行结果:
Thread2[1]
Thread1[1]
Thread2[2]
Thread1[2]
Thread2[3]
Thread1[3]
Thread1[4]
Thread2[4]
解析:
线程不是按照先后顺序完成,
(2)实现java.lang.Runnable接口
publicclassRunnableTestimplementsRunnable{
StringthreadName;
RunnableTest(String_threadName){
threadName=_threadName;
}
publicvoidrun(){
for(inti=1;i<5;i++){
System.out.println(threadName+"["+i+"]");
}
}
publicstaticvoidmain(Stringargs[]){
Threadthread1=newThread(newRunnableTest("thread1"));
RunnableTestr=newRunnableTest("thread2");
Threadthread2=newThread(r);
thread1.start();
thread2.start();
}
}
运行结果:
thread1[1]
thread2[1]
thread2[2]
thread2[3]
thread2[4]
thread1[2]
thread1[3]
thread1[4]
解析:
两种定义方式;
比较两种方法:
Thread类中还有其他的方法可以重写,如果不想重写最好使用Runnable接口;
三、线程调度
除了学过的start()方法和run()方法,还有
(1)返回当前正在执行的线程方法currentThread()
例子:
publicclassCurrentThreadTestextendsThread{
publicvoidrun(){
System.out.println(Thread.currentThread().getName());
System.out.println(Thread.currentThread());
}
publicstaticvoidmain(Stringargs[]){
CurrentThreadTestt1=newCurrentThreadTest();
CurrentThreadTestt2=newCurrentThreadTest();
t1.start();
t2.start();
}
}
运行结果:
Thread-0--通过CurrentThread().getName()得到线程名
Thread[Thread-0,5,main]--通过CurrentThread()方法得到,5是优先级
Thread-1
Thread[Thread-1,5,main]
(2)等待线程终止方法join()
使用这个方法可以暂停目前正在执行的线程,直到调用join()方法的线程被执行完为止
例子演示:
publicclassJoinThreadTestimplementsRunnable{
publicvoidrun(){
for(inti=1;i<5;i++){
System.out.println(Thread.currentThread().getName()+""+i);
}
}
publicstaticvoidmain(Stringargs[]){
Threadt0=newThread(newJoinThreadTest());
Threadt1=newThread(newJoinThreadTest());
System.out.println(t0.isAlive());
System.out.println(t1.isAlive());
t0.start();
t1.start();
System.out.println(t0.isAlive());
System.out.println(t1.isAlive());
try{
t0.join();
t1.join();
}catch(InterruptedExceptione){
}
System.out.println(t0.isAlive());
System.out.println(t1.isAlive());
for(inti=0;i<5;i++){
System.out.println("主线程"+Thread.currentThread().getName());
}
}
}
运行结果:
false--start()之前,isAlive()返回线程活动状态是false
false
true--start()之后,isAlive()返回线程活动状态是true
true
Thread-01--join()以后,中断当前线程,直到调用join()方法的线程完成为止
Thread-02
Thread-03
Thread-04
Thread-11
Thread-12
Thread-13
Thread-14
false--t0,t1结束后,isAlive()返回线程状态为false
false
主线程:
main--运行主线程
主线程:
main
主线程:
main
主线程:
main
主线程:
main
解析:
这样的结果貌似不能说明问题,但是去掉join()方法以后,运行结果为:
false
false
true
true
true
true
Thread-01
Thread-02
Thread-03
Thread-04
Thread-11
主线程:
main
Thread-12
主线程:
main
Thread-13
主线程:
main
Thread-14
主线程:
main
主线程:
main
解析:
这个样足以说明join()方法的作用;
另外,join()方法中断了当前线程会抛出InterruptedException异常,必须放在try..catch中,当抛出异常时,当前线程中断状态会被清除。
(3)设置和取得线程优先权
通过setPriority(inti)方法设置,优先级共有10级,最高为10,默认为5;
除了数字优先级以外,还有MIN_PRIORITY,MAX_PRIOROTY,NORM_PRIORITY;
方法getPriority()得到线程的优先级;
实例:
publicclassPriorityThreadTestimplementsRunnable{
publicvoidrun(){
System.out.println(Thread.currentThread().getName()+"优先级为"+Thread.currentThread().getPriority());
}
publicstaticvoidmain(Stringargs[]){
PriorityThreadTestr=newPriorityThreadTest();
Threadt0=newThread(r);
Threadt1=newThread(r);
Threadt2=newThread(r);
t0.setPriority
(1);
t1.setPriority(10);
t0.start();
t1.start();
t2.start();
}
}
运行结果:
Thread-1优先级为10
Thread-2优先级为5
Thread-0优先级为1
解析:
这三个线程共享数据和代码,优先级高的先被执行;
修改run()函数
publicvoidrun(){
for(inti=0;i<3;i++){
System.out.println(Thread.currentThread().getName()+"优先级为"+Thread.currentThread().getPriority());
}
}
执行结果:
Thread-2优先级为5
Thread-2优先级为5
Thread-2优先级为5
Thread-1优先级为10
Thread-1优先级为10
Thread-1优先级为10
Thread-0优先级为1
Thread-0优先级为1
Thread-0优先级为1
解析:
优先级高的先被执行,当运行次数多的情况下效果更明显,这里不再测试
(4)正在执行线程休眠的方法sleep()
让一个线程休眠一段时间再执行,单位是毫秒,当线程调用sleep()以后就处于阻塞状态,休眠结束以后线程不一定会立即执行,除非优先级高或者空闲
例子:
publicclassSleepThreadTestimplementsRunnable{
StringthreadName;
SleepThreadTest(StringthreadName){
this.threadName=threadName;
}
publicvoidrun(){
System.out.println(threadName+"isstart");
intsleepTime=(int)(Math.random()*100);
System.out.println(threadName+"sleep"+sleepTime);
for(inti=0;i<2;i++){
System.out.println(threadName+""+i);
try{
Thread.sleep(sleepTime);
}catch(InterruptedExceptione){
e.printStackTrace();
System.out.println(e.toString());
}
}
System.out.println(threadName+"isend");
}
publicstaticvoidmain(Stringargs[]){
Threadthread1=newThread(newSleepThreadTest("thread1"));
Threadthread2=newThread(newSleepThreadTest("thread2"));
thread1.start();
thread2.start();
}
}
运行结果:
thread1isstart
thread2isstart
thread1sleep25
thread2sleep64
thread10
thread20
thread11
thread1isend
thread21
thread2isend
解析:
一个线程休眠,其他的运行,这个例子很好的说明了问题;
实际上多线程代码执行顺序都是不确定的,每次执行结果都是随机的;
(5)暂停正在执行的线程yield()
对于相同优先级的线程采用分时多工的原则,执行顺序一般是先进先出,如果使相同优先级的线程获得执行机会,就要使用yield()方法;
yield()方法暂停当前线程执行其他线程,谁调用谁暂停;
例子:
publicclassYieldThreadTestimplementsRunnable{
StringthreadName;
YieldThreadTest(StringthreadName){
this.threadName=threadName;
}
publicvoidrun(){
for(inti=0;i<3;i++){
System.out.println(threadName+""+i);
Thread.yield();
}
}
publicstaticvoidmain(Stringargs[]){
YieldThreadTestr=newYieldThreadTest("thread1");
Threadt0=newThread(r);
Threadt1=newThread(newYieldThreadTest("thread2"));
t0.start();
t1.start();
}
}
运行结果:
thread10
thread20
thread11
thread21
thread12
thread22
解析:
yield()方法在某些情况下不一定会被使用,当循环次数大时,不是均匀的;
(6)中断线程方法interrupt()
如果线程被wait(),join(),sleep()方法之一阻塞,线程会抛出异常,推出阻塞状态,重新排队等待;
例子说明interrupt()方法:
publicclassInterruptThreadTestextendsThread{
privatebooleanblockFlag=false;
publicvoidrun(){
while(!
blockFlag){
System.out.println("Threadisrunning");
try{
Thread.sleep(1000);
}ca
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 异常 线程
![提示](https://static.bdocx.com/images/bang_tan.gif)