# Java-异常、断言、日志

# 异常

# 异常分类

Throwable

派生自Error或RuntimeException的异常称为非检查型异常,其他的异常是检查型异常

# 声明异常

public static void method() throws IOException, FileNotFoundException{
    //something statements
}

注意:若是父类的方法没有声明异常,则子类继承方法后,也不能声明异常。

通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。

private static void readFile(String filePath) throws IOException {
    File file = new File(filePath);
    String result;
    BufferedReader reader = new BufferedReader(new FileReader(file));
    while((result = reader.readLine())!=null) {
        System.out.println(result);
    }
    reader.close();
}

异常抛出的规则:

  • 非检查型异常可以不使用throws关键字抛出,运行时会被系统抛出
  • 检查型异常必须throws抛出或者捕获,不然无法通过编译

# 自定义异常

public class MyException extends Exception {
    public MyException(){ }
    public MyException(String msg){
        super(msg);
    }
    // ...
}

# 捕获异常

异常捕获处理的方法通常有:

  • try-catch
private static void readFile(String filePath) {
    try {
        // code
    } catch (FileNotFoundException e) {
        // handle FileNotFoundException
    } catch (IOException e){
        // handle IOException
    }
}
  • try-catch-finally
try {                        
    //执行程序代码,可能会出现异常                 
} catch(Exception e) {   
    //捕获异常并处理   
} finally {
    //必执行的代码
}
  • try-finally:如果真的有异常抛出,必须由外层catch语句捕获
ReentrantLock lock = new ReentrantLock();
try {
    //需要加锁的代码
} finally {
    lock.unlock(); //保证锁一定被释放
}
  • try-with-resource
private  static void tryWithResourceTest(){
    try (Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
        // code
    } catch (IOException e){
        // handle exception
    }
}

# 使用技巧

  • 只在异常情况下使用异常
  • 在finally清理资源或使用try-with-resources
  • 优先捕获最具体的异常
  • 包装异常时不抛弃原始的异常
  • 不要使用异常控制程序流程
  • 不要在finally中使用return

# 断言

# 日志

Last Updated: 12/23/2024, 4:18:13 AM