[Java学习]异常
一、异常
异常基本概念
- 异常用类表示,类的对象表示具体异常事件。
- 当出现异常Java虚拟机会new一个异常对象。
- 异常对象输出的异常信息,可以帮助我们完善程序,处理异常,使程序更健壮。
异常继承关系结构图
- Throwble有两个子类Error和Exception:错误不能处理,直接退出jvm;异常可以处理,但不处理也会退出jvm。
- Exception的直接子类及直接子类的子类都是编译时异常,Exception的子类RuntimeException的子类是运行时异常。编译时异常指发生几率大的异常,运行时异常指发生几率小的异常。编译时异常需要程序员处理:两种方法:捕捉:try catch 、声明抛出:throw。
二、处理异常的两种方法
处理异常方法一:throws
编译时异常示例
- 因为FileInputStream的构造方法中抛出了 FileNotFoundException,所以能得到异常。而FileNOtFoundException 继承IOException,IOException直接继承Exception,所以这个异常是编译时异常。
- 解决方法,可以在函数声明的地方throws相应异常。
关于throws
throws是向上抛,抛给调用它的,当主函数throws,编译阶段会通过,但运行会打印出异常信息,jvm虚拟机会结束程序。
也就是,throws实际是在“推卸责任给上层”。
处理异常的方法二:try catch
语法
try{
语句
}
catch(异常类型1 变量名1){//JVM自动创建一个异常类型1的对象,将该对象的内存地址赋值给变量1。
对异常1的处理
}
catch(异常类型2 变量名2){
对异常2的处理
}
注意:
- catch由上到下要是由小异常到大异常(子类到类)
- 只会执行一个catch
try catch底层实现
catch是一个方法,异常类型的对象作为它的参数。
调用异常对象的printStackTrace()或getMessage()来调试异常
try{
语句
}
catch(FileNotFoundException e){
e.printStackTrace();//打印异常堆栈信息,信息更全,推荐。
//e.getMessage();//打印异常描述信息
}
三、异常中的finally语句块
finally
finally语句块中的代码一定会执行,除非在try中exit(0)即退出了JVM。
语法
try{
}
finally{
}
try{
}
catch{
}
finally{
}
finally作用:把需要释放的资源写在finally里,保证资源一定被释放。
区分完全无关的finally final finalize
final关键字:在面向对象中提到,final修饰的类无法被继承,final修饰的方法无法被覆盖...
finalize是object类的一个方法:垃圾回收机制在回收Java对象之前,会先调用对象的该方法。
finally语句块:异常机制中的,见上。
四、自定义异常
例子
package com.test.jinhj;
//可以选择作为编译时异常还是运行时异常,这里继承Exception,所以是编译时异常
public class UserNameShortException extends Exception {
public UserNameShortException() {}
public UserNameShortException(String message) {
super(message);
}
}
package com.test.jinhj;
public class Register {
public void register(String name) throws UserNameShortException{
if(name.length()<6) {
//手动抛出异常
throw new UserNameShortException("用户名必须大于6位!");
}
System.out.println(name);
}
}
package com.test.jinhj;
public class RegisterTest {
public static void main(String[] args) {
Register person=new Register();
try {
String name="gaga";
person.register(name);
}
catch(UserNameShortException e){
e.printStackTrace();
}
}
}
异常机制与方法的覆盖
(子类)重写的方法只能比(父类)被重写的方法抛出更“小”的异常 。???why
posted on 2019-03-14 22:45 coding_gaga 阅读(149) 评论(0) 编辑 收藏 举报