什么是异常??
异常即异常事件,在程序运行时所出现的错误。
异常类的层次结构如下图所示
Throwable是所有异常类的父类,只有对象是此类(或其子类)的实例时,才能通过java虚拟机或throw语句抛出。
Throwable有两个子类:Error和Exception,分别表示错误和异常。Exception 又分为运行时异常类和非运行时异常类。
错误异常类
异常 | 说明 |
---|---|
Error | 合理的应用程序不应该试图捕获的严重错误 |
AssertionError | 指示某个断言失败 |
ExceptionInInitalizerError | 静态初始化程序中发生意外异常 |
IOError | 发生太严重的I/O错误 |
NoClassDefFoundError | 当java虚拟机或ClassLoader试图加载但无法找到类的定义时,抛出的异常 |
StackOverflowError | 当应用程序递归太深而发生栈满溢出时,抛出错误 |
LinkageError | 指示一个类一定程度上依赖于另外一个类,但在编译前一个类后,后一个类发生了不相容的改变 |
ThreadDeath | 进程死亡错误 |
VirtualMachineError | 虚拟机错误 |
OutOfMemoryError | 内存溢出或没有可用的内存提供给垃圾回收机器时,java虚拟机无法分配一个对象,这时抛出异常 |
运行时异常类
异常 | 说明 |
---|---|
RuntimeException | 所有运行时异常的超类 |
ArithmeticException | 算术运算异常 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出异常 |
IllegalArgumentException | 当向方法传递了一个不合法或不正确的参数时,抛出异常 |
NumberFormatException | 当试图将字符串转换成一种数值类型,但该字不能转换成此格式,抛出异常 |
IllegalStateException | 在非法或不适当的时间调用方法时,抛出异常 |
NullPointerException | 空指针异常 |
非运行时异常类
异常 | 说明 |
---|---|
ClassNotFoundException | 应用程序试图通过字符串名加载类,但没有找到具有指定名称的类的定义,抛出异常 |
java.io.IOException | 当发生某种I/O异常,抛出异常 |
java.io.FileNotFoundException | 当试图打开制定路径的文件失败时,抛出异常 |
自定义异常类
自定义异常类一般继承于Exception或其子类,定义自定义异常类的主要目的是表示特定于应用的异常,否则没有太大意义。
方法异常声明:
throw用来抛出异常,throws用来声明方法将产生某个异常,一个实际方法它们位置如下:
修饰符 返回类型 方法名(参数列表)throws 异常类名列表{
…
throw 异常类名;
…
}
异常处理
try …catch语句捕获处理异常
格式为:
try{
//可能引发异常的语句
}catch(异常类型 异常变量){
//在异常发生时执行代码
}finally{
//最终必须执行的代码,如释放资源等
}
try语句块用来启动java异常处理机制,一个try语句块可以引导多个catch语句,在try语句块里捕获到异常时,便不会执行块内剩下的语句,随后catch捕捉到该异常,finally无论发生异常与否,都必须执行,若不想执行,可在try语句块中使用System.exit(0)退出。
例:求n!要求处理如下异常:
1.输入的不是一个整数,而是实数,则不计算。
2.输入的数据是一个十六进制表示的串,则转换为十进制,在进行计算。
class Yichang extends Exception{
String s;
public Yichang(String a)
{
s=a;
}
public String toString() {
return (s);
}
}
import java.util.Scanner;
public class Ex2 {
public static void main(String[] args) throws Yichang {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
String a=s.next();
try {
for(int i=0;i<a.length();i++)
{
char q=a.charAt(i);
if(q>'F') {
throw new Yichang("数字无效");
}
}
}
catch(Yichang e) {
System.out.println(e);
}
int b=Integer.parseInt(a, 16);
System.out.print(b);
}
}