异常处理方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理方式相关的知识,希望对你有一定的参考价值。
Java提供的是异常处理的抓抛模型(编译时 / 运行时异常均适用)- “抛”:当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应异常类的对象,并将此对象抛出。(自动抛出 / 手动抛出:“throw”+异常类对象)(注意是对象)
>一旦抛出此异常类的异常,那么程序终止运行
>此异常类的对象抛给方法的调用者
>可以自定义异常类:①继承现有异常类;②提供一个序列号;③提供几个重载的构造器 - “抓”:抓住上一步抛出的异常类对象的方式,即“异常处理方式”
Java提供了两种方式用来处理一个异常类的对象:
try{
//可能出现异常的代码
}catch(Exception1 e1){
//处理方式1
}catch(Exception2 e2){
//处理方式2
}
…
finally{
//一定要执行的代码(可选)
}
注:
1.try内声明的变量在 { } 外不可见(类似与局部变量),出了 try{ }就不能调用;
2.仅当出现异常时 catch 才执行,无异常不执行;
3.finally是可选的,且finally中的代码一定会被执行(即使 try / catch 中仍有未处理异常或有return语句);
4.以上代码中的“Exception1”指的是异常的类型,可以直接用“Exception”来广泛的抓异常(相当于多态性),也可以用具体的异常类型;
5.catch中的语句是对异常对象的处理,可以自定,也可以直接调用抓住的异常的对象的方法;
6.catch语句之间的关系有点像“ if-else ”,即:从上往下执行,若 catch 匹配了 try 抛出的异常类对象,则传入该异常类对象,执行语句,然后跳出到 finally(如果有的话);同样这也意味着 catch 语句需要“范围小的先声明”,即:如果有存在子父类关系的 Exception,那么子类的应该写上面,如果写反,会报错(“会报错”这一点并不像 if-else )。如果关系为“并列”,那么孰上孰下都可以;
7.如果异常处理了,则其后的代码继续执行;
8.try-catch是可以相互嵌套的。
例:
@Test
public void test5(){
Scanner read = new Scanner(System.in);
int a;
try{
a = read.nextInt();
System.out.println(a);
}catch(Exception e){
System.out.println("输入的不是整数");
}
read.close();
}
处理方式二:
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法语句中产生的异常类型,也可以是它的父类。(注意是类)(与throw区别开),但是其子类重写此方法时只能抛出该父类的异常类或其子类(否则使用多态性时可能出现编译通过但是catch“罩不住”的情况)。
抛异常只是把问题把上递交了(异常类对象传给调用者),最终还是要解决的,解决的根本方法还是try - catch,如果抛到了main方法还未根本解决 ,那异常会直接给虚拟机。
对于编译时异常来说,必须处理,而运行时异常可以不显式的处理。
以上是关于异常处理方式的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式创建 MapView 并添加标记导致片段中出现空指针异常
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段