JavaSe之异常处理篇



JavaSe之异常处理篇
1.Java异常处理的分类
Java 异常可分为可检测异常,非检测异常和自定义异常。
可检测异常
        可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,例如:sqlExecption 这个异常就是一个检测异常。你连接 JDBC 时,不捕捉这个异常,编译器就通不过,不允许编译。

非检测异常
         非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。例如:一个数组为 3 个长度,当你使用下标为3时,就会产生数组下标越界异常。这个异常 JVM 不会进行检测,要靠程序员来判断。有两个主要类定义非检测异常:RuntimeException 和 Error。          

Error 子类属于非检测异常,因为无法预知它们的产生时间。若 Java 应用程序内存不足,则随时可能出现 OutOfMemoryError;起因一般不是应用程序的特殊调用,而是 JVM 自身的问题。另外,Error 一般表示应用程序无法解决的严重问题。

RuntimeException 类也属于非检测异常,因为普通 JVM 操作引发的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在 Java 应用程序中会频繁出现。因此,它们不受编译器检查与处理或声明规则的限制。

自定义异常
       自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义。可以显示代码多个位置之间的错误的相似性,也可以区分代码运行时可能出现的相似问题的一个或者多个错误,或给出应用程序中一组错误的特定含义。例如,对队列进行操作时,有可能出现两种情况:空队列时试图删除一个元素;满队列时试图添加一个元素。则需要自定义两个异常来处理这两种情况。

2.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());
		}
	}
}

     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值