异常
异常
软件程序在运行过程中,可能遇到异常问题,我们叫异常,英文是Exception,意思是例外
异常指程序中出现的不期而至的各种状况,例如:文件找不到,网络连接失败,非法参数等
异常发生在程序运行期间,它影响了正常的程序执行流程
- 检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常
- 运行时异常:运行时异常是可能会被程序员避免的异常
- 错误:错误表示异常,而是脱离程序员控制的问题,错误在代码中常常被忽略,例如:栈溢出
异常体系结构
Java把异常当作对象来处理,并定义一个基类Java.lang.Throwable
作为所有异常的超类
在Java API 中已经定义了许多异常类,这些异常类分为两大部分,错误 Error和异常 Exception
Exception和Error
-
error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关
Java虚拟机运行错误(
Vrtual MachineError
),当VJM不再有继续执行操作所需要的内存资源,会出现OutOfMemoryError
,这些异常发生时,Java虚拟机(JVM)一般会选择线程终止还有虚拟机试图执行应用时,如类定义错误(
NoClassDefFoundError
),链接错误(LinkageError
),这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况 -
Exception
在Exception分支中有一个重要的子类
RuntimeError
(运行时异常)ArrayIndexOutOfBoundExcepton
(数组下标越界)NullPointerException
(空指针异常)ArithmeticException
(算术异常)MissingResourceException
(丢失资源)ClassNotFoundException
(找不到类)等异常,这些异常通常是不检查异常,程序中可以选择捕获处理,也可以选择不处理
这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这些异常的发生
-
Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(VJM)一般会选择终止线程;Exception通常情况下是开心被程序处理的,并且在程序中一个尽可能的去处理这些异常
Java异常处理机制
抛出异常,获取异常
try{
//(尝试运行的)程序代码
}catch(异常类型 异常的变量名){
//异常处理代码
}finally{
//异常发生,方法返回之前,总是要执行的代码
}//Crtl+Alt+T 自动生成
以上语法有三个代码块:
- try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象
- catch语句块会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个
Throwable
类型的参数,表示可捕获异常类型。当try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对象。catch语句可以有多个,用来匹配多个中的一个异常,一旦匹配上后,就不再尝试匹配别的catch块了,通过异常对象可以获取异常发生时完整的JVM堆栈信息,以及异常信息和异常发生的原因等 - finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并且这个语句块总是在方法返回前执行,目的是给程序一个补救的机会
例如:
public class Exception1 {
public static void main(String[] args) {
try { //要监测的代码块
Scanner in=new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+num2+"="+num1/num2);
}catch (InputMismatchException e){ //catch(异常类型 异常名称)
System.out.println("被除数和除数必须要是整数");
}catch (ArithmeticException e){
System.out.println("除数不能为0");
}catch (java.lang.Exception e){ //多重catch的使用
System.out.println("其他未知异常");
}
finally { //不管是否出现异常,finally一定会被执行。
System.out.println("程序运行结束");
}
}
}
//假设捕获多个异常,需要从小到大捕获