异常

来源:互联网 发布:社会工程学数据库查询 编辑:程序博客网 时间:2024/05/20 06:28

 


异常

1、main函数抛出的异常是交给了虚拟机,产生了运行时异常,虚拟机默认的处理方式是打印异常信息,并且终止程序。
调用方法时,对方声明几个异常,就对应有几个catch块,如果多个catch块中的异常间出现继承关系时,父类异常catch块放在最下面。
自定义异常类中,可以通过构造方法传入该异常的描述,在方法体中继承父类的即可:
public MyException(String msg)
{
    super(msg);
}
throw和throws的区别:
throw放在方法内,throws放在方法上;
throw后面跟的是异常对象(throw new Exception();)
throws后面跟的是异常类,多个类间用逗号隔开(throws MyException,HisException)。

2、RuntimeException:运行时异常,这个异常很特殊:
如果在函数内容里抛出(throw)它或者它的子类异常,函数上可以不用抛出(throws);
如果在函数上声明了该异常,调用者可以不用进行处理(throws、try),编译一样通过。

之所以不用在函数声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止,因为再运行时,出现了无法继续运算或者让程序继续运行的情况,希望程序停止后,对代码进行修正。
同样,自定义异常时:如果该异常的发生,将导致无法再继续进行运算,就让自定义异常继承RuntimeException。
java中的异常分两类:
1)编译时被检测的异常(不抛不try会失败);
2)编译时不被检测的异常(运行时异常,RuntimeException及其子类,建议不处理)

3、finally:
finally代码块:定义一定要执行的代码。
通常用于关闭资源:关闭文件,关闭数据库连接等。
但,finally有一种情况读不到,就是:System.exit(0);//程序退出,jvm结束。
处理异常三种格式:
1)try、catch、finally
2)try、catch
3)try、finally
下面这张方式也可以编译通过,因为问题被内部解决了(catch了):

try{throw new Exception();}catch(Exception e){}

4、catch是用于处理异常的,如果没有catch就代表异常没有被处理过,如果该异常是检测时异常,那么必须声明。
异常在子父类覆盖中的体现:
1)子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖后方法,只能抛出父类的异常或者该异常的子类;
2)如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3)如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出。如果子类方法发生了异常,就必须要进行try处理。
异常的好处:
1)将问题进行封装;
2)将正常流程代码和问题处理啊相分离,方便阅读
throw单独存在时(不是封装在方法里),下面不能定义语句,因为永远执行不到,编译会失败


【扩展】五片内存区域:
栈、堆、方法区(静态和非静态的)、寄存器、本地方法区(底层的)。具体描述还没有去查。

原创粉丝点击