程序的问题
- 严重问题:Error,比如内存溢出,不处理,因为没办法处理
- 问题:Exception
- 编译期问题 不是RuntimeException异常,必须处理,否则编译无法通过
- 运行期问题 RuntimeException,不处理,因为代码不够严谨,需要修正代码
处理方案
try...catch...finally
try{
可能出现问题的代码;
}catch(异常名 变量){
针对问题的处理;
}finally{
释放资源;
}
变形格式:
try{
可能出现问题的代码;
}finally{
释放资源;
}//为了释放资源,异常没有处理
finally:被finally控制的语句一定会执行,除非之前JVM退出了。用于释放资源,在IO流或数据库中可以经常见到
如果catch里有return语句,finally的语句会在return语句前执行
变形格式:
try{
可能出现问题的代码;
}catch(异常名 变量){
针对问题的处理;
}
注意: 1. try中的代码越少越好
2. catch中必须有东西
3. 若不明确异常类型,可以用Exception或父类异常来接受,且父类异常需放在最后
代码形式:1. 有几个异常,写几个try...catch
2. 写一个try,多个catch 此方法一旦在try中有问题,会在catch中匹配异常,有匹配的话执行catch中的代码并结束
-JDK7的新特性
try{
可能出现问题的代码;
}catch(异常名1 |异常名2 ... 变量){//异常必须是同级的
针对问题的处理;
}
throws
格式: throws 异常类名... (必须跟在方法的括号后面)
注意:-尽量不要在main方法上抛出异常
- 若抛出的是运行期异常,可以不处理,如果是编译期异常,必须处理
throw
在方法内部抛出异常对象 throw new 异常类名();
用户自定义异常
继承Exception
继承RuntimeException
- 只需写构造方法
注意事项:
1.子类重写父类方法时,子类抛出的异常必须和父类相同或是父类异常的子类异常
2.父类抛出多个异常时,子类不能抛出父类没有的异常
3.子类重写的方法没有抛出异常,子类的方法也不能抛出,只能用try...catch...解决
throws和throw的区别
throws:跟在方法的括号后面,可抛出多个异常,由方法调用者处理异常,表示可能发生异常,不一定发生异常
throw: 在方法体内,只能抛出一个异常,由方法体内处理,一定抛出了一个异常
异常中需要了解的方法
1.public String getMessage() 异常的消息字符串
2.public String toString() 返回异常的简单信息,类的 name(路径名) + “: ” + getLocalizedMessage()方法的结果(默认返回getMesage())
3.public void printStackTrace() 获取异常的信息及位置,返回void,把信息输出到控制台
异常处理原则
- 能处理用try{}catch{},后续程序可以运行
- 不能处理用throws,后续程序不能运行