Java异常处理

Throwable
Error
Exption
IOException
Runtime
Exception

     所有异常都是由Throwable继承而来,但是下一层立即分解为两个分支:Error 和 Exception。

1、异常的分类

  • Error:描述 Java 运行系统的内部错误和资源耗尽。
  • IOException:IO 错误引发的异常。
  • RuntimeExcetpion:由程序内部产生的错误。
    • 派生于 RuntimeException 的异常包含下面几种情况:
      • 错误的类型转换。
      • 数组访问越界。
      • 访问 null 指针
    • 不是派生于 RuntimeException 的异常包括:
      • 视图在文件尾部后面读取数据。
      • 视图打开一个不存在的文件。
      • 视图根据给定的字符串查找 Class 对象,而这个字符串类并不存在。

如果出现 RuntimeException 异常,那么一定是你的问题。

2、声明受检查异常

如果遇到了无法处理的情况,那么 Java 的方法可以抛出一个异常。因为一个方法不仅要告诉编译器返回什么值,还要告诉编译器可能发生的错误。

下面几种情况下应该声明异常:

  • 调用一个抛出受查异常的方法,例如:fileInputStream 构造器。
  • 程序运行过程中发现错误,并利用 throws 语句抛出一个受查异常。
  • 程序出现错误,例如:a[-1]=0。
  • Java 虚拟机和运行时库出现的内部错误。

 如果出现前两种情况之一,者必须告诉调用的程序员可能抛出异常。因为任何一种抛出异常的方法都可能是一个死亡陷阱。如果没有处理捕获这个异常,则执行的程序就会结束。

 但是,不需要声明 Java 的内部错误,既从 Error 继承的错误。任何代码都具有抛出那些异常的潜能,而我们对其没有任何控制能力。

3、如何抛出异常

例如:
 在一个名为 readData 的方法正在读取一个首部具有下列信息的文件:

Content-lenth:1024

 然而,读到733个字符之后文件就结束了。我们认为这是一种不正常的情况,希望抛出一个异常。
1)、首先确定抛出什么异常
 例子中的异常归结为 IOException 是一种很好的选择。仔细阅读 Java API 文档之后发现:EOFException异常的描述是“在输入过程中,遇到一个未预期的 EOF 后的信号”。这正是我们要抛出的异常。
2)、抛出异常

thorw EOFException();

或者

EOFException e = new EOFException();
throw e;

4、创建自己的异常类

在程序中,可能会遇到任何标准的异常类都没有能够充分描述清楚的问题。这种情况下就需要创建自己的异常类。

 我们需要创建做的只是定义一个派生于Exception 的类,或者派生于 Exception 子类的类。定义的类应该包含两个构造器,一个是默认构造器,另一个是带有详细信息描述的构造器。

class FileFormatException extends IOException {
	public FileFormatException(){};
	public FileFormatException(String gripe){
		super(grips);
	};
}

5、捕获异常

如果某个异常发生时没有任何地方进行捕获,那程序就会终止执行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈的内容。

想要捕获异常必须用 try/catch 语句块。

try {
	// 代码块
} catch(Exception e){
	// 异常的处理
}

 在 catch 子句中可以抛出一个异常,这样做的目的是改变异常的类型。如果开发了一个其他程序员使用的只系统,那么,用于表示子系统故障的异常类型可能会有多种解释。

6、finally 子句

 当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行。不管是否有异常捕获,finally 子句中代码都被执行。

7、分系堆栈轨迹元素

堆栈轨迹是一种方法调用的过程列表,它包含程序执行过程中方法调用的特定位置。

可以调用 Throwable 类的 printStackTrace 方法访问堆栈轨迹的文本描述信息。

Throwable t = new Throwable();
StringWriter out = new StringWriter();
t.pringStackTrace(new PrintWrite(out));
String description = out.toString();

一种更加灵活的方法使用 getStackTrace 方法,它会得到 StackTraceElement 对象的一个数组,可以在你的程序中分系这个对象数组。

Trowable t = new Trowable();
StackTraceElement[] frames = t.getStackTrace();
for (StackTraceElement frame : frames)

StackTraceElement 类含有能够获得文件名和当前执行的代码行号的方法,同时,还含有能够获得类名和方法名的方法。toString 方法将产生一个格式化字符串,其中包含所获得的信息。

8、使用异常机制的技巧

  • 异常处理不能代替简单的测试:
    和简单的测试相比,异常的捕获所花费的时间大大超过了前者,因此异常的基本规则是:只在异常情况下使用异常机制。
  • 不要过分的细化异常
    将正常处理与异常处理分开。
  • 利用异常层次结构
    不要只抛出 RuntimeException 异常。应该寻找更加适合的子类创建自己的异常类。
    不要只捕获 Thowable 异常,否者,会使代码更加难度,更难维护。
  • 不要压制异常
    在 Java 中,往往强烈地倾向关闭异常,如果编写了一个调用另一个方法的方法,而这个方法可能 100 年才抛出一个异常,那么,编译器会因为没有将这个异常列在 throws 表中产生抱怨。而没有将这个异常列在 throws 表中主要出于编译器将会对所有调用这个方法的方法进行异常处理考虑。因此,应该将这个异常关闭。
  • 在检查错误时,“苛刻”要比放任更好
    当检查到错误的时候,有个程序员担心抛出异常。在用无效的参数调用一个方法时,抛出一个异常要比返回一个虚拟值更好。
  • 不要羞于传递异常
    传递异常要比捕获异常更好。

9、Java中的异常

Throwable
Error
Exception
VirtulMachineError
AWTError
StrackOverFlowError
OutOfMemeoryError
IOException
RuntimeException
EOFException
FileNotFoundException
ArithmeticException
MissingResourceException
ClassNotFoundException
NullPointerException
IllegaArgumentException
ArrayIndexOutOfBoundsException
UnknownTypeException
  • EOFException
    在输入过程中意外地到达文件结尾或流结束的信号。
    此异常主要由数据输入流用于流结束信号。注意,许多其他地输入操作在流结束时返回一个特殊值,而不是抛出异常。
  • FileNotFoundException
    表示尝试打开指定路径名表示的文件失败。
  • ArithmeticException
    在发生异常算术条件时抛出。例如,整数“除以零”将发生此类的实例。
  • MissingResourceException
    表示资源丢失。
  • ClassNotFoundException
    当应用程序尝试使用其字符串名称通过其字符串名称加载类时,但找不到具有指定名称的类。
  • NullPointerException
    空指针异常,表示null对象的其他非法用途。
  • IllegaArgumentException
    方法被传递了非法或者不适当的参数。
  • ArrayIndexOutOfBoundsException
    数组使用了非法的索引访问(索引为负或大于或等于数组大小)。
  • UnknownTypeException
    表示遇到未知类型的类型。如果语言不断发展并将新的类型添加到TypeMirroe层次结构中,则会发生这种情况。类型访问者可能会抛出该异常,以表示该访问者是为该语言的早期版本创建的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值