JAVA异常处理(随笔)

异常处理

异常从方法中抛出。方法调用者可以捕获以及处理该异常。(不应该让方法终止程序,应有调用者决定是否终止程序)
throw语句的执行称为“抛出一个异常(throw an exception)”,异常就是一个从异常类创建的对象;异常类就是 java.lang.ArithmeticException//算术异常,还有其他的异常类。
构造方法ArithmeticException(str)被调用构建一个异常对象,其中str是描述异常的信息。

try{
    code to run;
    A statement or amethod that may throw an exception;
    More code to run;
} //包含正常情况下执行的代码
catch(type ex){
    code to process the exception;
} //异常被catch捕获,catch块代码被执行已处理异常
//之后,catch块之后的语句被执行,不再返回到throw语句执行throw之后的语句

也可以没有throw语句来显式的抛出异常,但catch的参数要符合try块中可能出现的异常类型(比如要求输入integer类型整数,但输入的是double类型,那么catch语句参数应为(InputMismatchException ex),输入不匹配异常)
异常是对象,而对象都采用类来定义。异常根类是java.lang.Throwable。

Object - Throwable - Exception - ClassNotFoundException
                               - IOException
                               - RuntimeException - ArithmeticException
                                                  - NullPointerException
                                                  - IndexOutOfBoundsException
                                                  - IllegalArgumentException
                                                  - 更多的类
                   - Error     - LinkageError
                   			   - VirtualMachineError
                               - 更多的类
                               

//抛出的异常都是这个图中给出类的实例,或是它们子类的实例。可以通过继承Exception或它的子类创建自己的异常类
异常类三种主要类型:
1)系统错误(system error)由java虚拟机抛出,用Error类表示。Error类描述内部系统错误,如果发生,只有通知用户及尽量稳妥的终止程序
2)异常(exception)是由Exception类表示的
例:ClassNotFoundException : 试图使用一个不存在的类;IOException : 同输入/输出相关操作,如无效的输入,读文件超过末尾
3)运行时异常(runtime exception)用RuntimeException类表示的,描述程序设计错误,如错误类型转换,访问越界数组或数值错误
例:ArithmeticException : 一个整数除以0.注:浮点数的算术运算不抛异常
NullPointerException : 试图通过一个null引用变量访问一个对象
IndexOutOfBoundsException : 数组下标超出范围
IllagalArgumentException : 传递给方法的参数非法或不合适
异常的处理器是通过从当前的方法开始,沿着方法调用链,按照异常的反向传播方向找到的。
Java异常处理包括声明异常,抛出异常,捕获处理异常
1)声明异常 每个方法声明它可能抛出的必检异常的类型,这样调用者会被告知有异常
例:public void myMethod() throws Exception1, Exception2,…,ExceptionN
注:如果父类方法没有声明异常,那在子类对其重写时就不能声明异常
2)抛出异常 创建一个合适的异常类型的实例并抛出它
IllegalArgumentException ex = new IllegalArgumentException(“Wrong Argument”);
throw ex;
或 throw new IllegalArgumentException(“Wrong Argument”);
//java api中每个异常类至少两个构造方法,一个无参,一个有参。该参数为异常消息,可以通过一个异常对象调用getMessage()获取。
3)捕获异常 try块代码抛出异常,java从当前方法开始,沿着方法调用链,按照异常反向传播方向逐个检查catch块并判断catch块中异常实例是否匹配该异常对象的类型。
若调用的方法链没有找到异常处理器(catch块)则程序终止并在控制台打印错误信息。
注意:如果一个catch块可以捕获一个父类的异常对象,它就能捕获那个父类所有子类异常对象。另外catch块异常被指定顺序非常重要,如果父类catch块出现在子类catch块之前,就会导致编译错误。
如 catch(RuntimeException ex){}
catch(Exception ex){}
如果方法声明一个必检异常,就必须在try-catch块中调用它,或者在调用方法中声明会抛出的异常
如 方法p1调用方法p2,p2会抛出一个必检异常(IOExecption)
void p1(){ void p1() throws IOException{
try{ p2(); } 或 p2();
catch (IOExecption ex){…} }
}
JDK7多捕获特征简化异常代码编写
catch (Exception1 | Exception2 | Exception3 |…| ExceptionN){…}

                    java.lang.Throwable(异常类的根类)
+getMessage(): String                  //返回描述该异常对象的信息
+toString(): String                    //返回三个字符串的连接:1.异常类的全名;2.“: ”冒号+空白;3.getMessage()方法
+printStackTrace(): void               //在控制台上打印Throwable对象和它的调用栈的跟踪信息
+getStackTrace(): StackTraceElement[]  //返回一个栈跟踪元素的数组,表示和该异常对象相关的栈的跟踪信息

finally子句
无论异常是否产生或捕获,都会执行finally子句
何时使用异常:当错误需要被方法的调用者处理的时候,方法应该抛出一个异常。异常处理需要调用栈返回,需要初始化新的异常对象,要花更多的时间和资源。
一个项目中多个类都会发生的共同异常应该考虑设计一个异常类。对于简单错误就进行局部处理,无须抛出异常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值