异常处理
什么是异常?
运行程序的过程中,由于输入了一些非法的数据或一些其他原因导致的问题。
为什么要处理异常?
当出现了异常没有处理,后续的程序就不能被执行
如何处理异常
异常类的体系结构
Throwable是异常类结构的根类,两个子类Error和Exception,一般情况下Error下的异常不需要程序员处理,Exception下的异常是程序员要处理的。
Exception的子类分为两种异常:
- 运行时异常(RuntimeException的子类):在编译期不会出现,在运行期出现,通常是通过代码来避免异常而不需要异常处理。常见的:ArrayIndexOutOfBoundsException、NullPointerException、ClassCastException、ArithmeticException、NumberFormatException
- 受检查异常(除了RuntimeException类之外的所有异常):在编译期,如果不处理异常则程序不能编译。
程序的错误提示:Unhandled exception type FileNotFoundException
怎么找到异常出现的位置
出现一个异常后,会输出很多异常信息,找第一行你写的代码。
处理方式
- try-catch-finally 语句
语法:
try{
statement;
}catch(ExceptionType e){
statement;
}catch(ExceptionType e){
statement;
}…
finally{
statement;
//finally语句块中的语句,只要进入到了try语句一定会被执行
//释放资源的代码
}
执行过程:当执行到try语句中内容时,如果出现了一个异常,由JVM捕获这个异常形成一个对象,直接执行到catch中的代码。
为什么要写多个catch?因为不同的异常可能有不同的处理方式,如果处理方式都相同可以用Exception统一catch
如果有多个catch,子类异常的catch写在前面 - throws 关键字
在方法、构造器的后面throws 异常类型,将异常对象抛给调用者。
当封装一个方法或编写一个构造器的时候,可能会出现异常,不知道如何处理时,应该用throws抛出,交给调用者处理。
throw关键字
将异常对象抛到程序中。
throws和throw的区别
throws是一种异常处理方式,将异常抛给调用者
throw是将异常抛到程序中
自定义异常类
通过继承 Exception 自定义异常类。
final、finally、finalize区别
final修饰类、属性、方法,具体…
finally是try-catch-finally语句中一定会被执行的语句块
finalize是Object类的一个方法,当垃圾回收器要回收一个对象时,调用对象的finalize方法完成回收。
基本类型封装类
为每一个基本类型都定义了一个封装类,封装类中封装了对应的基本类型属性。
byte – Byte
short – Short
int – Integer
long – Long
char – Character
float – Float
double – Double
boolean – Boolean
自动拆装箱(是JDK5的新特性)
基本类型和对应的封装类型在类型上
Integer i = 3; //自动装箱操作 Integer i = new Integer(3);
int j = new Integer(3); //自动拆箱操作 int j = 3;
常量池
存储常量对象,数据共享且存储对象,整数常量对象值的范围(-128~127)