您的位置:首页 > 编程语言 > Java开发

Java异常总结

2016-09-06 19:40 204 查看
Java异常总结
 
一.java异常类结构体系图
 



二.java异常基本概念
 
(一)Throwable:异常和错误的基类,提供了错误堆栈实现等一系列方法。 两个直接子类:Error & Exception

 

(二)两个子类区别:

     1. Error: 程序不应该捕捉的错误,应该交由JVM来处理。一般可能指非常重大的错误。这个错误我们一般获取不到。

     2. Exception:程序中应该要捕获的错误。这个异常类及它的子类是我们需要学习获取的。

   (1)RuntimeException:运行期异常,是Exception的子类,但不需捕捉的异常超类,但是实际发生异常时,还是会蹦的,只是编译时没有报错而已。比如除数为零,数组空指针等等,这些都是在运行之后才会报错。

   (2)除了RuntimeException类和它的子类,其他类都被定义为Checked类,是需要显式处理可能出现的异常,否则编译就报错了。Checked类主要包含:IO类和SQL类的异常情况,这些在使用时经常要先显示处理异常(使用throws或try   catch捕获)。
 

三.java常见的异常(最好记住)
(一)Exception 异常层次结构的根类
(二)ArithmeticException 算术错误情形,如以零作除数
(三)ArrayIndexOutOfBoundsException  数组小于或大于实际的数组大小
(四)NullPointerException  尝试访问null对象成员
(五)ClassNotFoundException   不能加载所需的类(常见于多态中向下转型)
(六)InputMismatchException   欲得到的数据类型与实际输入的类型不匹配
(七)IllegalArgumentException 方法接收到非法参数
(八)ClassCastException  类强转异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。

这些常见的异常都是Runtime异常,发送这些异常时,我们都要知道是怎么修改。当然还有其他的异常需要记住的,比如IO异常,上面只是一些比较基础的。
 

四.Java异常处理的格式
(一)java异常处理的关键字有5个:try、catch、finally、throw、throws。
(二)java异常捕获的格式。程序没有出现异常时,不会执行catch。

      1.try-catch

每次出现异常,都会去catch匹配,如果能匹配到,程序执行catch里面的代码

如果没有匹配到,程序抛出异常退出

     2.try-catch-catch...

如果出现异常,那么会一个一个去匹配catch子类在前,父类在后,否者出现编译错误

    3.try-finally

finally是程序必须执行的一个代码块,除了一种情况System.exit(0);

    4.try-catch-finally
 5.throw new Exception(“输入错误的提示!”);
这句语句也要放在try-catch语句模块里面或者放在throws的方法体里面。这种情况可用在获取的值,不符合自己的期望,比如要求输入不大于10的数,获取到大于10的数时,主动抛出异常,提示用户输入错误。但是一般不建议使用,因为使用异常捕获还要经过异常机制处理,会花费时间和内存,降低程序效率。
   (三)throw和throws的区别
这只是有点相似的关键字,并没有任何关联,要学会区分。
throw是用在方法体里面的,一般是放在判断情况的后面,手动抛出异常。
throws只能用在需要捕获异常的方法的方法名的括号后面使用。
 
 
 
 
四.Java异常处理的原则和技巧
 
    (一)避免过大的try块。不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。

    (二)细化异常的类型。不要不管什么类型的异常都写成Excetpion。

    (三)catch块尽量保持一个块捕获一类异常。不要忽略捕获的异常,捕获到后要么处理,
要么转译,要么重新抛出新类型的异常。

    (四)不要把自己能处理的异常抛给别人。

    (五)不要用try...catch参与控制程序流程。异常控制的根本目的是处理程序的非正常情况。
所以像那些可以预料的错误,尽量在执行之前就做好相应的处理,
比如除数为零或空指针问题,要做事前判断再运行程序。

习题:

1、写一个登录(login)的方法,方法中有两个String类型形参,分别是账户名密码,校验用户账户名密码

,账户名不是"liwenzhi"或者密码不是"123456",则该方法向外抛出一个异常,
异常信息提示文字是“输入账户或者密码不正确”。

这题考察的是throw的使用:参考答案代码如下

public class Login {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
boolean isLoginSuccess = true;// 用户是否登陆成功
System.out.println("请您的用户名:");
String inputName = scanner.next();// 获取用户输入的姓名
System.out.println("请输入6位数的密码:");
String inputCode = scanner.next();// 获取用户输入的密码
scanner.close();
if (!"liwenzhi".equalsIgnoreCase(inputName)
|| !"123456".equalsIgnoreCase(inputCode)) {
isLoginSuccess = false;
throw new Exception("你输入的账户名或密码不对!");
}

if (isLoginSuccess) {
System.out.println("******恭喜你登陆成功******");
} else {
System.err.println("******你的账号已经被锁定******");
}
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: