黑马程序员技术交流社区
标题:
异常预习
[打印本页]
作者:
zhangwenjin
时间:
2016-7-12 02:01
标题:
异常预习
异常的概念
异常就Java程序在编译和运行时出现的错误
异常的分类
顶层为Throwable 下分为分三种
Error
通常出现重大问题如:服务器宕机数据库崩溃等。不编写针对代码对其处理。
Exception
除了 RuntimeException 和其所有子类,其他所有的异常类都是在编译的时候必须要处理的,要么try,要么抛
RuntimeException
RuntimeException 和其所有的子类,都不会在编译的时候报异常,而是在运行时报异常,这时候我们就需要回头看看我们的代码是否有问题,比如角标越界,空指针等
jvm是如何处理异常的
jvm发现运算是已经违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做ArithmeticException当除0运算发生后,jvm将该问题打包成了一个异常对象.并将对 象抛给调用者main函数,new ArithmeticException("/by zero");
main函数收到这个问题时,有两种处理方式:1,自己将该问题处理,然后继续运行
2,自己没有针对的处理方式,只有交给调用main的jvm来处理jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异 常的信息.异常出现的位置打印在了控制台上同时将程序停止运行
处理异常处理方式:
一个是try catch finally
try是用来检测异常的
catch是用来捕获异常的
finally释放资源
1,try catch 不需要释放资源
2,try catch finally
需要释放资源
3,try finally
需要释放资源,但是不能对象异常捕获,需要交给调用处理
另一个是throws
抛出去
[java] view plaincopy
try catch示例:
[java] view plaincopy
try {
需要检测的代码;
}
catch(异常类 变量) {//异常类名 对象名= new 异常类名();
异常处理代码;
}
世界上最真情的相依,就是你在try,我在catch,无论你发神马脾气,我都默默接受,静静处理
public class Demo1_Exception {
public static void main(String[] args) {
Demo d = new Demo(); //创建对象
try {
int num = d.div(10, 0); //调用div方法并将10和0给方法的参数
System.out.println(num); //打印调用方法的结果
} catch (Exception e) { //当try检测出异常的时候,就跳到catch语句中
//接收异常Exception e = new ArithmeticException("/ by zero");
System.out.println(e); //打印异常对象的toString方法
System.out.println(e.toString());
System.out.println("错了,除数为零了"); //提示
}
System.out.println("11111111111111111111"); //异常处理完代码可以继续执行
}
}
class Demo {
public int div(int a,int b) { //a = 10,b = 0
return a / b; // new ArithmeticException("/ by zero");
}
}
[java] view plaincopy
try catch finally 示例:
[java] view plaincopy
public static void main(String[] args) {
try {
System.out.println(1/0);
} catch (Exception e) {
System.out.println("catch执行了吗");
//System.exit(0); //如果先退出虚拟机就不会执行finally了
return; //return在将死之前,会让finally完成未完成的遗愿
} finally {
System.out.println("finally执行了吗");
}
}
final,finalize,finally的区别
1,final可以修饰类,可以修饰方法,可以修饰变量
2,finalize,在对象没有更多引用,垃圾回收的时候调用
3,finally 关闭流,数据库等,释放资源
throw的概述
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
throws和throw的区别
a:throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws如果抛出的是RuntimeException及其子类,调用该方法的时候不用处理,抛出RutimeException和不抛效果一样
如果抛出的是除了RuntimeException及其子类.调用方法必须处理
b:throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
异常注意事项
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
如何使用异常处理
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2