Java 异常

// 异常机制,通过把各种不同类型的异常情况进行分类,把异常情况表示成异常类,可以充分发挥类的可扩展性和可重用性
// 并且将异常流程的代码和正常流程的代码分离,提高程序的可读性,灵活的处理异常,如果当前有能力处理异常,就捕获
// 否则只需要抛出异常,由方法调用者来处理它
// java虚拟机的方法调用栈,每个线程都有一个独立的方法调用栈,对于java应用程序的主线程,堆栈底部是程序的入口
// 方法main(),当一个新方法被调用时,java虚拟机把描述该方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方法,
// 当java虚拟机追溯到调用栈的底部的方法时,仍然没有找到处理该异常的代码块,则按以下步骤处理:
// 1. 调用异常对象的 printStackTrace()方法,打印来自方法调用栈的异常信息
// 2. 如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行,如果该线程是主线程(main),那么整个应用程序被终止
// java程序中使用try catch语句不会对应用的性能造成很大的影响,仅仅当异常发生时,java虚拟机需要执行额外的操作,这时
// 会对性能产生负面影响,如果异常的代码块和捕获异常的代码块位于同一个方法中,这种影响小些,否则对性能的影响比较大,也即是
// 说如果当前方法有能力处理某种异常的能力,就尽量自行处理,不要把自己可以处理的异常推给方法调用者去处理
// finally,不管try代码块是否出现异常,都会执行finally代码块,
// throws字句,声明可能会出现的异常,但没有能力处理这种异常,可以在方法中声明处理throws字句来声明抛出异常,throws可以声明抛出多个异常
// throw语句:抛出异常,throw语句抛出的对象必须是java.lang.Throwable类或其子类的实例
// try代码块可以有零个或多个catch代码块,还可以有零个或至多一个finally代码块,多个catch中,应先声明子类
// 一个方法可能出现受检查异常,要么用try catch语句捕获,要么用throws子句声明将其抛出,否则编译错误,throw语句后不能紧跟其他语句,这些语句永远不会执行
// 异常流程的运行过程,try catch finally,如果还包含return和System.exit()语句,exit()语句会终止当前的java虚拟机进程,导致finally语句不被执行
// exit()方法的参数status表示程序终止时的状态码,零表示正常终止,非零表示异常终止。总之exit()后面的代码都不会执行
// try catch finally中使用return关键字,return语句退出本方法,在try catch中使用return,则会先执行finally代码块,再执行return,
// 虽然finally代码块在return之前执行,但是finally中的内容不能修改return语句的返回值内容,建议不要在finally代码块中使用return语句,因为会出现两种错误
// 1.finally中的return语句会把try catch中的return语句给覆盖了,2.在finally中使用return语句,会导致catch中抛出的异常出现丢失现象,
// getMessage()---返回String类型的异常信息,printStackTrace()打印跟踪方法调用栈而获得的详细异常信息,在程序调用阶段,此方法可用于跟踪错误
// Error类表示仅靠程序本身无法恢复的严重错误,比如内存空间不足,或者java虚拟机的方法调用栈溢出,多数情况下建议让程序终止
// Exception类表示程序本身可以处理的异常,所有例子都是针对这类异常,程序出现这类异常应尽可能处理异常,并使程序恢复运行,而不应该随意终止
// 异常分类:运行时异常这类异常java编译器不会检查它,也就是说,当程序可能出现这类异常时,即使没有用try-catch捕获,也没有用throws抛出他,还是会编译成功的,java虚拟机不会检查他
// 由于程序代码不会处理运行时异常,因此当程序在运行时出现了这种异常时,就会导致程序异常终止
// 受检查异常这种异常java编译器会检查他,也就是说当程序可能出现这类异常时,要么用try--catch语句捕获,要么用throws子句声明抛出,否则编译不会通过,一定要处理
// 区分运行时异常和受检查异常,受检查异常时可以修复的,可以把他们定义为Excpetion类的子类,而运行时异常无法让程序恢复运行的异常,java虚拟机不会检查,只要对程序做适当修改,就能避免这些异常,例如空指针和数组下标越界
// 所以运行时异常是可以尽量避免的,这类异常一旦发生,损失严重,捕获他并不是明智的办法,
// Error和运行时异常java编译器都不会检查,Error通常是由java虚拟机抛出的,在JDK中预定义了一些错误类,例如OutofMemoryError,一般不会扩展Error类来创建用户自定义的错误类
// 而运行时异常是可以扩展的,用户可以根据特定的问题来创建相应的运行时异常
// 异常转义和异常链,例如捕获一个异常,接着抛出一个更为合理的异常,或者可以开发出一个新的异常类
// 异常处理原则,滥用异常会降低程序的性能,影响可读性,应可能的避免异常,避免过于庞大的try代码块,在catch子句中指定具体的异常类型。

// 不要在catch代码块中忽略被捕获的异常,处理异常的措施:处理异常,重新抛出异常,进行异常转译,如果无法采取措施,就不要捕获异常,而是用throws字句声明将其抛出

public class Test5 {
	public void methodA(int money) throws Exception {
		if (--money <= 0) {
			throw new Exception("out of money");
		}
	}

	public void methodB(int money) throws Exception {
		try {
			methodA(money);
		} catch (Exception e) {
			System.out.println("----output of methodB()");
			System.out.println(e.getMessage());// 获取上层抛出的信息
			throw new Exception("Wrong");
		}
	}

	public static void main(String[] args) {
		try {
			new Test5().methodB(1);
		} catch (Exception e) {
			System.out.println("----output of main()");
			e.printStackTrace();
		}
	}
}

常见的运行时异常RuntimeException包括:全部继承RuntimeException,

1,NullPointerException 空指针异常

2,ClassCastException 强制类型转换异常  

3,IllegalArgumentException 传递非法参数异常

4,ArithmeticException 算术运算异常 典型的就是0作为除数的时候

5,ArrayStoreException 向数组中存放于声明类型不兼容对象异常

6,NegativeArraySizeException 创建一个大小为负数的数组错误异常

7,NumberFormatException 数字格式异常  Integer.parseInt("ab3");

8,SecurityException 安全异常

9,IndexOutOfBoundsException 数组下标越界 int[] a = new int[3]; int b = a[3];数组b没有声明

10,UnsupportedOperationException 不支持的操作异常,有可能子类中不想支持父类中有的方法,可以直接抛出这个异常

11,StringIndexOutOfBoundsException 字符串越界,String s = "hello", char c = s.charAt(6);


Error异常非常严重,应用程序不能恢复的,例如LinkageError,java虚拟机生成并抛出,java程序不能处理

Error和RuntimeException的子类免于编译时的检查,RuntimeException异常由系统检测,用户的java程序可不做处理,系统交给缺省的异常处理程序


public static void main(String[] args) {
        String a = "1";
        try {
            if (a != "3") {
                throw new IOException("这类受检查异常必须处理");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        if (a != "2") {
            throw new NullPointerException("这类运行时异常可以不做处理,编译也能通过");
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值