Java07-异常

NiuMT 2020-06-03 20:58:30
Java

常见异常

image-20201014185843978

image-20201014170646657

Java 程序的执行过程中如出现异常会生成一个异常类对象该异常对象将被提交给 Java 运行时系统这个过程称为抛出(throw)异常。

异常对象的生成

异常处理机制一:try-catch-finally

try{
    ...... //可能产生异常的代码
}
// 如果明确知道产生的是何种异常,可以用该异常类作为 catch 的参数;也可以用其父类作为 catch 的参数。
catch( ExceptionName1 e)
    ...... //当产生 ExceptionName 1 型异常时的处置措施
}
catch( ExceptionName2 e)
    ...... //当产生 ExceptionName 2 型异常时的处置措施
}
finally{// 可选
    ...... //无论是否发生异常 都无条件执行的语句
}
  1. final 是可选的;不论在 try 代码块中是否发生了异常事件, catch 语句是否执行, catch 语句是否有异常, try / catch 语句中是否有 return, finally 块中的语句都会被执行。
  2. 像输入输出流、数据库连接、网络编程Socket等资源、JVM是不能自动回收的,需要手动释放资源,这时需要放到finally。
  3. catch中的异常类型:子类异常必在父类异常之上,否则报错。
  4. getMessage() 获取异常信息,返回字符串
  5. printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值 void 。
  6. try中声明的变量,出了try结构后,就不能被调用

异常处理机制二:throws

如果一个方法 中的语句执行时,可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理而由该方法的调用者负责处理 。

在方法声明中用 throws 语句可以声明抛出异常的列表,throws 后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。(throws后可以跟多个异常,逗号隔开)

异常后续的代码,不会再执行。

public void readFile (String file) throws FileNotFoundException{
    ……
    //读文件的操作可能产生 FileNotFoundException 类型的异常
    FileInputStream fis new FileInputStream (file);
    ……
}

重写方法不能抛出比被重写方法范围更大的异常类型 。 在多态的情况下,对 method()A 方法的调用-异常的捕获按父类声明的异常处理 。

public class A {
    public void methodA () throws IOException
    ……
} }
public class B1 extends A {
    public void methodA () throws FileNotFoundException
    ……
} }
public class B2 extends A {
    public void methodA () throws Exception { //报错
    ……
} }

两种机制的选择:

  1. 父类被重写的方法没有throws抛出异常,则子类重写的方法也不能使用throws,如果子类重写的方法中有异常,必须使用try-catch-finally结构
  2. 执行的方法a中,先后调用了递进关系的另外几个方法,建议这几个方法用throws的方式处理,方法a考虑使用try-catch-finally方式处理

手动跑抛出异常-throw

Java 异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出也可根据需要使用人工创建并抛出 。

用户自定义异常类

image-20201014194832899

image-20201014195014137