# Java-异常、断言、日志
# 异常
# 异常分类
派生自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
# 断言
# 日志
← Java-反射 Java从入门到精通 →