一、finally
finally代码块,定义的是一定会被执行的代码,无论是否有异常。通常用于关闭资源,例如数据库。catch中的return意味结束主函数,但finally中的内容仍然会执行。
二、异常语句的格式
三、异常在子父类中的覆盖
4、如果子类方发发生了异常,就必须要进行try处理,绝对不能抛
5、如果在子类的覆盖方法确实需要抛出非父类的异常或者该异常的子类,则必须在内部解决
class AException extends Exception{}
class BException extends Exception{}
class Fu{
void show() throws AException{}
}
class Zi extends Fu{
void show() throws AException{} //或者 void show() throws BException{ 因为父类已经有问题,不能比父类还有问题
}
class Demo{
public static void main(String[] args){
ExceptionDemo ed = new ExceptionDemo();
try{
ed.div(1,-1);
}catch(FuShuException e){
System.out.println(e.getMessage());
}finally{
System.out.println("finally");//finall中存放的是一定会被执行的代码
}
}
}
四、异常的总结
try
{
需要检测的代码;
}
catch ()
{
处理异常的代码;
}
finally
{
一定会执行的代码;
}
a. finally中定义的通常是关闭资源代码,因为资源必须要释放。
b. 只有一种情况finally内部语句不执行,catch里有System.exit(0);,系统退出,虚拟机结束。
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
按照java的面向对象的思想,将程序中出现的特有问题进行封装。
8.异常的好处
a. 将问题进行封装成对象。
b. 将正常流程代码和问题处理代码相分离,方便阅读。
9.异常的处理原则
a. 处理方式有两种,try、catch或者throw。只有catch才算处理。
b. 调用抛出异常的功能时,抛出几个异常就处理几个,不多不少。一个try对应多个catch情况。
c. 多个catch,父类的catch放到最下面。
d. catch内需要定义针对性的处理方式,不要定义printStackTrace或者输出语句,也不要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
try
{
throw new AException();
}
catch (AException e)
{
throw e;
}
如果该异常处理不了,但并不属于该功能出现的异常。可以将该异常转换后,再抛出和该功能相关的异常。
或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,让调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。
try
{
throw new AException();
}
catch (AException e)
{
//对AException进行处理。
throw new BException();
}
异常的注意事项
在子父类覆盖时:
1. 子类抛出的异常必须是父类异常的子类或者子集。
2. 如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能catch处理不能抛出。
参考例子:用电脑上课和计算图形面积。
例1:
class Demo
{
public static void main(String[] args)
{
try
{
showExce();
// throw new Exception();肯定发生异常,下面无法执行。编译错误。
System.out.println("A");//有异常不执行,没有异常就执行。
}
catch (Exception e)
{
System.out.println("B");
}
}
public static void showExce() throws Exception
{
throw new Exception();//将异常封装在函数中,函数上声明,有可能出问题。
}
}
class Demo
{
public static void fun()
{
try
{
throw new Exception();
//System.out.println("A");
}
catch (Exception e)
{
System.out.println("B");
}
}
public static void main(String[] args)
{
try
{
fun();
}
catch (Exception e)
{
System.out.println("C");
}
}
}
五、包(package)
也可以通过在编译时,设定路径将类文件放入指定的文件夹内,例如,javac –d . PackageDemo.java,编译时将Package.class文件放入当前目录下的pack文件夹内;系统自动生成pack文件夹,也可以将其指定在其他文件,例如:javac –d d:\myclass PackageDemo.java。如果想设定classpath更快的找到包,只要设定路径为包的父目录即可,因为类文件和包是一个整体。如果不写包,java会将当前文件夹作为默认包存在。
4. 函数的权限不够大。类公有后,被访问的成员也要公有,才可以被访问。函数的权限有3:public、private和默认。类和函数都必须要公有。
| public | protected | 默认 | private |
同一个类中 | √ | √ | √ | √ |
同一个包中 | | | √ | |
子类 | | | | |
不同包中 | √ | | | |