Java异常
一、java异常概念和分类
1、Java概念
异常(Exception)就是程序在运行过程中出现的一些错误,我们通过面向对象的思想,把这些错误也用类来描述,那么一旦产生一个错误,即就是创建了某一个错误的对象,这个对象就是我们所说的异常对象。以下是常见的异常:
(1)IndexOutOfBoundsException:
- ArrayIndexOutOfBoundsException
数组角标越界异常 角标不在数组范围内 - StringfIndexOutOfBoundsException
字符串角标越界异常 角标不在字符串范围内
(2)NullPointerException
空指针异常 对null调用其成员。
(3)ArithmeticException
数学运算异常 非法的数学运算。
(4)ClassCastException
类型转换异常 将类进行错误的强制转换。
(5)NumberFormatException
数字格式化异常 将数字字符串进行解析。
(6)InputMismatchException
输入不匹配异常 在输入时输入非法数据。
(7)ParseException
时间解析异常 非法的时间格式。
(8)StackOverFlowError
栈内存溢出异常 函数递归。
(9)OutOfMemoryError
堆内存异常 数组空间开辟过大 程序中对象太多。
异常分类
-
Throwable
是java中所有异常和错误的超类,其两个子类为 Error(错误) 和 Exception(异常)
-
Error: 是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。
-
Exception
是程序本身可以捕获并且可以处理的异常。其中可分为运行时异常(RuntimeException)和非运行时异常,也叫做受检异常
- 非检查异常:也称为“运行时异常”,此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。编译器不会检查运行时异常,在抛出运行时异常时编译器不会报错,当运行程序的时候才可能抛出该异常。Error及其子类和RuntimeException 及其子类都是非检查异常。
- 检查异常:也称为“编译时异常”,编译器在编译期间检查的那些异常。由于编译器“检查”这些异常以确保它们得到处理,因此称为“检查异常”。如果抛出检查异常,那么编译器会报错,需要开发人员手动处理该异常,要么使用try-catch捕获,要么使用throws语句重新抛出,否则编译不通过。除了RuntimeException之外,所有直接继承 Exception 的异常都是检查异常。
从程序执行的过程来看编译时异常和运行时异常
- 编译时异常:程序在编译时发生的异常(javac 源文件名.java)
- 运行时异常: 程序在运行时发生的异常(java 字节码文件名)
-
二、java异常的处理
try - catch - finally
将可能出现异常的代码放到try{}中, 运行时, 如果代码发成了异常的话,就会生成一个对应的异常类的对象。这个产生的异常对象会与catch的异常类型相匹配,匹配成功后就被 catch 捕获,然后运行catch{}中的代码, 一般catch中的代码为处理异常的代码, 比如返回异常的信息和返回异常的详细信息等. 一旦异常处理完成,就会跳出当前的try-catch结构。无论有没有发生异常finally中的代码都会最后被执行。catch多个异常类型的时候, 如果有子父类关系,小的范围写上面大的范围写下面。
public static void main(){
try{//try监控区域
System.out.println(1/0);
}catch(ArithmeticException){//catch捕获异常
System.out.println("程序出现异常,分母不能为0");
}finally{//处理善后工作
System.out.println("finally");
}
}
throws 关键字和 throw 关键字在使用上的几点区别如下:
- throws 用来声明一个方法可能抛出的所有异常信息,throw 则是指拋出的一个具体的异常类型。
- 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
- throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
public static void main(){
test(1,0);
//假设在方法中,处理不了这个异常。方法上抛出异常
public static void test(int a,int b){
if(b==0){
//使用throw 语句用来直接拋出一个异常,后接一个可拋出的异常类对象(主动的抛出异常,一般在方法中)
throw new ArithmeticException();
}
}
public void readFile() throws IOException {
//定义方法时声明异常
FileInputStream file = new FileInputStream("read.txt"); //创建 FileInputStream 实例对象
int f;
while ((f = file.read()) != -1) {
System.out.println((char) f);
f = file.read();
}
file.close();
}
//声明异常后需要用try,catch捕获异常
try {
t.readFile(); // 调用 readFHe()方法
} catch (IOException e) {// 捕获异常
System.out.println(e);
}
}
标签:Java,错误,捕获,try,catch,异常,运行
From: https://www.cnblogs.com/daimadaxia/p/17971147