关于异常

什么是异常?
程序运行中的非正常行为,例如给用户的录入不符合规范,或者由于疏忽有的对象没有赋值,或者使用数组时调用的下标超标等等都可以称为程序的异常。异常都会造成程序出错中断,是很严重的行为,所以我们要处理可能出现的各种异常。

我们怎么来解决异常?
java虚拟机为我们提供了 异常处理机制来解决各种异常。

什么是异常处理机制?
就是程序中预先设置好的对付异常的办法, 1运行程序,2出现异常,3处理异常,4继续运行。

认识异常的五个关键字try,catch,finally,throw,throws
try {}  
//我们 有可能出现错误的错误代码就放在try块中

catch (错误类型){}
//当try中有异常产生时,异常就会到catch中进行错误匹配, 假如类型匹配就会进行捕捉假如匹配 失败就不会进入 catch块操作,就会跳过。匹配成功就会执行catch块中的代码执行操作。
e.getMessage();获取异常信息的描述字符串   e.printStackTrace();打印异常的堆栈信息

finally  {}
// 无论catch中异常类型是否匹配,都会执行finally中的操作,只有 一种情况才会不执行finally
就是在finally之前就 System.exit(1);就已经退出java虚拟机了,就不执行finally
//假如在finally前面有 return,执行顺序是,1先执行try,2在匹配执行catch, 3在 执行finally,4最后return,退出方法。

throw{}
手动生成并抛出异常对象,在方法体内,只能抛出一个, 用了throw必须try catch或者throws抛出

throws 异常,异常,异常
声明方法可能抛出的各种异常类型,用逗号隔开,提醒调用这个方法的人
调用者有两个方法解决: 1try catch捕捉异常  2继续用throws抛出异常(不建议,能解决就解决)
要是没有人解决,最后会由main方法抛出,由java虚拟机来解决

try catch finally中 try可以和catch或者finally搭配使用

假如try catch finally都有的时候有三种运行情况
1 没有异常try中的代码块运行,不进入catch,继续执行finally
try {
int num = input.nextInt();
if (num == 1) {
System.out.println("java");
}else if (num==2) {
System.out.println("安卓");
}else if (num==3) {
System.out.println("C#");
}else{
System.err.println("输入错误,请输入数字1~3");
System.exit(1);
}
} catch ( Exception e) {
System.out.println( e.getMessage());
System.out.println( e.getStackTrace());
System. err.println(" 出现错误输入!");
}finally{
System.out.println("谢谢你提出宝贵的意见!");
}
这个例子中假如输入的是1~3的整数,就不会发生异常

2 发生异常时在catch()中匹配,不管有没有匹配类型,都会执行finally
  假如有该类型的匹配就就先执行catch,再执行finally
3发生异常, 没有匹配到就不会执行catch跳过catch执行finally
4假如 try或catch中有return就会 先执行finally在执行return

假如有多重catch块
1排列catch语句顺序, 先子类后父类
2发生异常时 按顺序逐个进行匹配
3 只执行第一个与catch语句匹配的catch

throw和throws的区别
throw: 生成并抛出异常
throws:声明方法内抛出了异常

throw: 位于方法体内部,可作为单独语句使用
throws:必须跟在方法参数列表后面,不能单独使用

throw: 抛出一个异常对象,并且只能是一个
throws:声明抛出异常类型,可以跟多个多个异常,用逗号隔开   

异常体系结构:
object
    |
Throwbale
    |
1,Exception(异常类父类)                                                                              2,Error(程序不能解决的错误)    
    |
a RuntimeException(运行时错误)  b SQLException(编译时错误)                                                                 |                             |                                                       |
    各种异常。。。                          ClassNotFoundException等

自定义异常步骤:
1 定义异常类,继承 Exception或RuntimeException或Throwbale(不推荐)
2 编写构造方法,继承父类的实现
3 实例化自定义异常对象
4使用 throw抛出
例如:
public class Test4 extends Exception{
//第一步继承异常父类
public Test4(String message) {
super(message);
// 第二步创建构造方法,带参的可以将我们要输出的异常提示当做参数写进去
}
}

public class Test4Student {
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) throws Test4 {
if (sex.equals("男")||sex.equals("女")) {
this.sex = sex;
}else{
throw new Test4("性别只能为男或者女");
//第三步直接创建我们异常类的对象
}
}
public static void main(String[] args) {
Test4Student student = new Test4Student();
try {
student.setSex("n");
} catch (Test4 e) {//第四步输出我们的异常类对象的异常内容
e.printStackTrace();
}
}
}

异常处理原则:
异常处理与性能
只能用于非正常情况
不要将 过于庞大的代码块放在try中
在catch中 指定具体的异常类型

需要对捕获的异常进行处理(不要想着往外抛,除非能力不足以已解决)










猜你喜欢

转载自blog.csdn.net/jinqianwang/article/details/80011918