java异常体系及异常处理

1. java异常的基础知识

   首先介绍java的异常体系结构(来自网络)

Throwable 类是 Java 语言中所有错误或异常的超类。Error 是程序无法处理的错误,表示运行应用程序时出现的比较严重的问题。表示代码运行时JVM出现的问题。包括动态链接失败,虚拟机错误等。程序对其不做处理。而Exception是程序本身可以处理的异常,又分为编译时异常和运行时异常。编译时异常是编辑器要求必须处理的异常,可以用try-catch语句捕获它,或者用throws子句声明抛出它。

 运行时异常:都是RuntimeException类及其子类异常,如:

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

不能加载所需的类  ClassNotFoundException

方法接收到非法参数  IllegalArgumentException
 

类型强制转换异常:ClassCastException

操作数据库异常:SQLException

文件未找到异常:FileNotFoundException

数组下标越界异常:ArrayIndexOutOfBoundsException

字符串转换为数字异常:NumberFormatException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

方法未找到异常:NoSuchMethodException

这些异常一般是由程序逻辑错误引起的,其特点是java编辑器不会检查它,总是由虚拟机接管。出现运行时异常后,如果没有捕获并处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。

2.异常处理机制

捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它 的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。

对于可能出现异常的代码,有两种常用的处理办法:
第一、在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常。

try{

     //包含可能会出现异常的代码以及声明异常的方法
}catch (ClassCastException e) {

     //捕获指定异常并进行处理 

}catch(ExceptionName e1){

    //捕获指定异常并进行处理

}finally{
 //必须执行的代码(如关闭资源)
 }

注意:

      try语句不能单独存在,可以和catch,finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,finally中的代码块无论是否出现异常都会执行。try、catch、finally这三个关键字均不能单独使用。不能在 finally 块中使用 return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。即finally中的return 会覆盖 try 或者catch中的返回值。

public static void main(String[] args)
{
    int re = bar();
    System.out.println(re);
}
private static int bar() 
{
    try{
        return 8;
    } finally{
        System.out.println("finally");
    }
}
/*输出:
finally
*/

      好多人认为try-catch语句是放在一起不能省略的。其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。

切记:catch和finally语句不能同时省略!!!

try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

  会执行

     1、不管有没有异常,finally中的代码都会执行

     2、当try、catch中有return时,finally中的代码依然会继续执行

     3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的

     4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

     5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值

第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。例如:

public void test1() throws Exception{

throw 抛出异常
如果代码可能会引发某种错误,可以创建一个合适的异常类实例并抛出它,这就是抛出异常。如下:
public static double method(int value) {
        if(value == 0) {
            throw new ArithmeticException("参数不能为0"); //抛出一个运行时异常
        }
        return 10 / value;
    }

throw和throws的区别:

1.throws出现在函数头,throw出现在方法体。throws在方法的声明处抛出一个异常,而throw是在方法体内抛出一个异常对象。

2.throw,如果执行了,那么一定是抛出了某种异常了,而throws表示可能出现,但不一定。

 

自定义异常

如果自定义异常,只需要继承Exception类即可。

package com.dsx.exception;

public class MyException extends Exception{
	private String msg;
	private String code;
	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}
	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}
	public MyException() {
		super();
	}

	public MyException(String message,String code) {
		super();
		this.msg = message;
		this.code = code;
	}
}

如有不足,欢迎留言指正。望不吝赐教。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值