//2021.07.22
目的
程序出现非致命错误或者语法错误时,让程序可以继续执行,比如当考虑的情况不够全面时。
异常的分类
- 编译时异常(必须处理)
- 运行期异常(选择性处理)继承自RuntimeExcpetion
基本语法
try{
//code
}catch(异常类型 名){
//code
}
出现的异常类型必须和catch()中的异常类型一直,但是catch中的异常类型可以是try类型出现的子类
所有的异常类的父类都是Exception
也就是说当使用下面这种方式时,可以捕获所有的异常(但是实际开发中一般不会使用)
try(){
//code
}catch(Exception e){
//code
//e.printStackTrace() 将异常输出到栈,可以看作是打印异常
}
2021/07/23 10:14
异常的分类
异常处理方案
编译期间异常处理案例
try{
//code 可能会出现异常的代码
FireWriter writter=new FireWriter(file);
//这里出现的是编译器异常
}catch(IOException e){
//code 异常处理
}finally{
writter.close();
}
运行期异常处理案例
String str=null;
try{
str.toCharArry();
//这里的异常是空指针异常,因为str的内容为空
//这里的异常是编译器异常,编译期可以通过且不做处理
}catch(NullPointerException e){
e.printStackTrace();
}
一些注意点
- try某一段语句中出现异常,后续语句将不会执行,直接跳转至catch
- catch语句可以存在多个
- 当出现的异常可能有多种类型时,可以使用到多个catch来捕获不同的异常
- 当出现的异常类型不同时,可以使用父类型的异常来捕获所有异常
- 但是父类型异常写在子类型前面时,会使子类型异常失去意义,导致编译错误
- 还有finally模块,3个模块,不能单独出现,但是try,catch,finally三个可以组合出现
- finally中的内容必定会执行 无论是否出现异常
try{
//code
}finally{
//code
}
//不做异常处理
-
- 只有中途手动exit(),即退出程序,可以不执行finally
- 即使前面出现了return ,也会在return之前执行finally
- 一般会在finally语句中结束一些占用资源且需要长时间开启的资源
- FileWriter
- FileReader
- ....
throws申明异常
如果一个方法中可能出现异常,但是又不方便处理时,可以使用申明异常由调用者处理
Tips:所有的运行时异常,都是默认抛出
public class test{
public static void main(Sting [] args]) throws Exception{
//main函数会收到method()的异常,继续申明抛出,但是会抛出到运行环境
}
public static void method() throws IOException{
//捕获到异常不处理,直接申明抛出会直接抛出给Mian方法
//但是程序的最后还是会进行异常处理
}
}
手动抛出异常对象 throw
public class test{
public static void main(String[] args]){
int age=1800
try{
if(age>150){
throw new RuntimeException("年龄过大")
//手动(抛出)制造一个异常并抛出
}catch(RuntimeException e){
e.printStackTrace();
}
}
sout("end");
}
}