Error 子类属于非检测异常,因为无法预知它们的产生时间。若 Java 应用程序内存不足,则随时可能出现 OutOfMemoryError;起因一般不是应用程序的特殊调用,而是 JVM 自身的问题。另外,Error 一般表示应用程序无法解决的严重问题。
RuntimeException 类也属于非检测异常,因为普通 JVM 操作引发的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在 Java 应用程序中会频繁出现。因此,它们不受编译器检查与处理或声明规则的限制。
在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。
Throwable 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Exception(异常)是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。在 EchoInput 类中,当试图调用 readLine 方法时,可能出现 IOException 异常。
Error(错误)表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。
Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。还有一类是非RuntimeException这一类的异常是必须要捕获的异常(在使用别人的方法的时候别人抛出来的异常我们就必须要捕获) 而RuntimeException是可以捕获也可以不捕获的异常
3.Java异常处理的使用
1.使用try...catch来捕获异常
try {
//........
} catch (Exception e) {
e.printStackTrace();
}
try {
try {
} catch (Exception e1) {
e1.printStackTrace();
}
} catch (Exception e2) {
e2.printStackTrace();
}
2.在方法上抛出异常
public static void test1() throws Exception{
//.......
}
3. 在方法内部抛出异常(当程序运行到某个语句的时候,一般是程序员自定义异常)
public static void test1(){
if(1<2){
throw MyException();
}
}
4.一般在处理异常之后我们需要关闭一些资源或者临时文件 这时候我们就需要使用finally关键字
finally关键字是在方法最后执行的语句块 不管有没有异常抛出---在jdbc操作的过程中很常见
public static void test1() throws MyException{
if(1<2){
throw MyException();
}finally{
///最后执行
}
}
5.
注意在有异常抛出的方法中当异常抛出的时候 语句会直接跳到catch语句块中而不会执行有异常语句的下面一些语句
在程序员自定的异常的时候跑出来的时候 我们需要在方法上抛出用来给后面的方法使用
4.Java异常处理的应用实例
在定义银行类时,若取钱数大于余额时需要做异常处理。
定义一个异常类 insufficientFundsException。取钱(withdrawal)方法中可能产生异常,条件是余额小于取额。
处理异常在调用 withdrawal 的时候,因此 withdrawal 方法要声明抛出异常,由上一级方法调用。
异常类:
class InsufficientFundsException extends Exception {
private Bank excepbank; // 银行对象
private double excepAmount; // 要取的钱
InsufficientFundsException(Bank ba, double dAmount) {
excepbank = ba;
excepAmount = dAmount;
}
public String excepMessage() {
String str = "The balance is" + excepbank.balance + "\n"
+ "The withdrawal was" + excepAmount;
return str;
}
}
银行类:
class Bank {
double balance;// 存款数
Bank(double balance) {
this.balance = balance;
}
public void deposite(double dAmount) {
if (dAmount > 0.0)
balance += dAmount;
}
public void withdrawal(double dAmount) throws InsufficientFundsException {
if (balance < dAmount)
throw new InsufficientFundsException(this, dAmount);
balance = balance - dAmount;
}
public void showBalance() {
System.out.println("The balance is " + (int) balance);
}
}
测试类:
public class ExceptionDemo {
public static void main(String args[]) {
try {
Bank ba = new Bank(50);
ba.withdrawal(100);
System.out.println("Withdrawal successful!");
} catch (InsufficientFundsException e) {
System.out.println(e.toString());
System.out.println(e.excepMessage());
}
}
}