JavaSEDemo15异常处理与线程同步 客官°小女子只卖身不卖艺 2021-09-25 06:56 256阅读 0赞 ### 文章目录 ### * 简介 * 易错练习题 * * 练习1 * 练习2 * 练习3 * 练习4 * 练习5 * 练习6 * TODO的用处 * 线程优先级常量 * 守护线程 * 线程常用的方法 * * start * setName * getName * setPriority * sleep * yield * join * 线程同步 * * 线程同步的三种方法 * * 1.同步代码块 * 2.同步方法 * 3.Lock锁(API级) # 简介 # * 本文是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 ![在这里插入图片描述][2021041214295990.png_pic_center] 2. 点击IDEA左下角的TODO,可以快速定位到你写的TODO位置,TODO就是todo,表示将要做的事。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h5cGVydGV4dDEyMw_size_16_color_FFFFFF_t_70_pic_center] # 线程优先级常量 # 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(); \} [2021041214295990.png_pic_center]: /images/20210923/3b5e407b8f534a06a6bfde60ffc07b05.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h5cGVydGV4dDEyMw_size_16_color_FFFFFF_t_70_pic_center]: /images/20210923/fd4b4ccf8c434144aa58ed2ae8693429.png
还没有评论,来说两句吧...