JavaSEDemo15异常处理与线程同步

本文介绍了Java异常处理的基本原则,包括易错练习和解析,强调了在覆盖方法时异常处理的要求。同时,讲解了线程的优先级、守护线程以及常用方法如start、sleep等。此外,详细探讨了线程同步的三种方式:同步代码块、同步方法和Lock锁,并提供了相关示例。

简介

  • 本文是2021/04/12整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

易错练习题

练习1

import java.io.IOException;  
class Super{  
public void ma() throws IOException{}  
}  
Interface IA{  
void mb();  
}  
public class MySub extends Super implements IA{  
public void ma() //1_________{  
}  
public void mb() //2_________{  
}  
}  
问:  在//1 处,填入以下________代码可以编译通过,在//2 处,填入_________代码可以编译通过。  
A.	throws java.io.IOException  
B.	throws java.io.FileNotFoundException, java.io.EOFException  
C.	throws java.sql.SQLException  
D.	不能抛出任何异常。  

答案
第一空A B
第二空 D
解析
当父类方法抛出异常,
子类对该方法进行重写时,可以不抛出异常 可以抛出异常本身或异常的子类

练习2

import java.io.*;  
import java.sql.*;  
public class TestTryCatch{  
public static void main(String args[]){  
try{  
ma(10);  
System.out.println(“No Exception”);  
}  
catch(EOFException ex1){  
System.out.println(“ex1”);  
}  
catch(IOException ex2) {  
System.out.println(“ex2”);  
}  
catch(SQLException ex3) {  
 
System.out.println(“ex3”);  
}  
}  
public static void ma(int n) throws Exception{  
if (n == 1){  
throw new IOException();  
}else if (n == 2){  
throw new EOFException();  
}else if (n == 3) {  
throw new SQLException();  
}  
}  
}  
选择正确答案:  
A. 编译不通过  
B. 编译通过,输出 No Exception  
C. 编译通过,输出 ex1  D. 编译通过,输出 ex2  
E. 编译通过,输出 ex3  

答案
A
解析
ma方法没有用catch处理或者throws声明。

练习3

public class TestTryCatch{  
public static void main(String args[]){  
System.out.println( ma() );  
}  
public static int ma(){  
int n;  
try{ 
n = 10/0;  
}catch(Exception e){  
}  return n;  
}  
}  
选择正确答案:  
A.	编译不通过  
B.	编译通过,输出-1  
C.	编译通过,输出 0  

答案
A

练习4

import java.io.*;  
class MySuper{  
public void m() throws IOException{}  
}  
class MySub extends MySuper{  
public void m() throws EOFException{
}  
}  
class MySub2 extends MySub {  
public void m() throws FileNotFoundException{
}  
}  
以上代码是否能编译通过?如果不能,应该如何修改?  

答案
将MySub2 extends MySub 改为 MySub2 extends MySuper
FileNotFoundException和EOFException属于同级异常。

练习5

import java.io.*;  
import java.sql.*;  
public class TestMyException{  
public static void main(String args[]){  
try{  
System.out.println("main1");  
ma();  
System.out.println("main2");  
}catch(Exception e){  
System.out.println("Catch Exception in main");  
System.out.println(e.getMessage());  
}  
}  
public static void ma() throws IOException{  
try{  
System.out.println("ma1");  
mb();  
System.out.println("ma2");  
}catch(SQLException e){  
System.out.println("Catch SQLException in ma");  
throw new IOException(e.getMessage());  
}catch(Exception e){  
System.out.println("Catch Exception in ma");  
System.out.println(e.getMessage());  
}  
}  
public static void mb() throws SQLException{  
throw new SQLException("sql exception in mb");  
}  
}  
问:该程序输出结果是什么?  

答案
main1
ma1
Catch SQLException in ma
Catch Exception in main
sql exception in mb

练习6

import java.io.*;  
import java.sql.*;  
class TestException{  
public static void main(String args[]){  
try{  
ma();  
}  
/*1*/  
catch(Exception e){}  
}  
public static void ma() throws IOException{ }  
}  
下面哪些代码放在/*1*/处可以编译通过?  
A.	catch(NullPointerException npe){}  
B.	catch(IOException ioe){}  
C.	catch(SQLException sqle){}  

答案
A B

TODO的用处

  1. 我们在注释后可以写上一个TODO
    在这里插入图片描述
  2. 点击IDEA左下角的TODO,可以快速定位到你写的TODO位置,TODO就是todo,表示将要做的事。
    在这里插入图片描述

线程优先级常量

NORM_PRIORITY 普通优先级 5
MAX_PRIORITY 最高优先级 10
MIN_PRIORITY 最低优先级 1

守护线程

  • Java中一共有两种线程,用户线程和守护线程。
  • 守护线程伴随用户线程,用户线程运行完后,守护线程会被杀死。
  • 最常见的守护线程是垃圾回收线程。
  • 将线程设置为守护线程的方法:setDaemon(true)

线程常用的方法

start

  • 功能:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

setName

  • 功能:设置线程的名称
  • 语法:线程名.setName(String name);
  • 还可以在创建线程时,通过构造方法为线程设置名称。

getName

  • 功能:返回线程的名称
  • 语法:线程名.getName

setPriority

  • 功能设置优先级
  • 语法:public void setPriority(int newPriority),newPriority的取值是1-10

sleep

  • 功能:使线程进入等待/阻塞状态
  • 语法:线程类名.sleep(long millis) 毫秒

yield

  • 功能:暂停当前正在执行的线程对象,并执行其他线程。(礼让其它线程)
  • 语法:线程类名.yield()

join

  • 功能:等待该线程终止(VIP插队)
  • 语法:线程名.join()

线程同步

线程同步的三种方法

1.同步代码块

synchronized(锁对象){
代码块
}
锁对象:this object对象 类的字节码对象

2.同步方法

  • 非静态同步方法,锁对象是this
  • 静态同步方法,锁对象是类的字节码对象,即类名.class

3.Lock锁(API级)

  • Lock是一个接口,其中最常用的实现类是ReentrantLock
  • 使用步骤:
    Lock lock = new ReentrantLock();
    lock.lock();
    finally{
    lock.unlock();
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值