finally使用
在一些代码中,就算发生了异常,但还是必须要执行的语句,就可以把它写进finally语句里,就会让那句代码一定会执行
//自定义异常
class NoShowException extends Exception
{
NoShowException(String message)
{
super(message);
}
}
//模拟功能类
class Demo
{
void show(int num) throws NoShowException
{
if(num < 5)
{
throw new NoShowException(num+"非法的数据");
}
System.out.println("show num"+num);
}
}
//测试类
class ExceptionDemo
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
d.show(4);
}
catch (NoShowException ex)
{
System.out.println(ex); //打印异常信息
//如果异常发生,处理完毕后,希望功能结束;
//可以使用return ;
}
finally
{
System.out.println("一直能执行到的代码");
}
System.out.println("Hello World!");
}
}
finally应用场景
很多时候如果一个程序需要返回值的话,怕出现异常就可以把return语句写在finally语句里
还有就是使用资源的时候,比如数据库连接,IO流,网络连接,这些资源进行关闭的时候,都是需要写在finally语句里
异常在方法复写中的细节
异常在继承或者实现中的使用细节:
- 子类覆盖父类的方法时,如果父类的方法声明异常,子类只能声明父类的异常或者该异常的子类,或者不声明,越来越精细
- 当父类的方法声明了多个异常时,子类覆盖时只能声明多个异常的子集,越来越精细
- 当覆盖的方法没有生命异常的时候,子类覆盖时无法声明异常的
问题:接口中没有声明异常,而实现的子类覆盖方法时发生了异常,怎么办?
无法进行throws声明,只能catch的捕获。万一问题处理不了呢?catch中继续throw
抛出,但是只能将异常转换成RuntimeException子类抛出。