文章目录
简介
- 本文是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的用处
- 我们在注释后可以写上一个TODO

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

被折叠的 条评论
为什么被折叠?



