java参数不匹配异常_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子句

何时使用异常:当错误需要被方法的调用者处理的时候,方法应该抛出一个异常。异常处理需要调用栈返回,需要初始化新的异常对象,要花更多的时间和资源。

一个项目中多个类都会发生的共同异常应该考虑设计一个异常类。对于简单错误就进行局部处理,无须抛出异常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值