java中的异常
--解释Error和Exception的区别?
Error:指的是JVM错误,这个时候的程序并没有执行,无法处理;
Exception:指的是程序之中出现的错误信息,可以进行异常处理,主要关心Exception。
--请解释java之中的异常处理流程
1.如果程序之之中产生了异常,那么会自动的由jvm根据异常的类型,实例化一个指定异常类的对象
2.如果这个时候没有异常处理操作,这个对象交给jvm进行默认处理方式,而后中断程序
3.如果有异常处理,由try语句捕获产生的异常类对象
4.与try之后的每一个catch进行匹配,如果匹配成功,使用 指定catch进行处理,没有任何catch匹配成功交给jvm默认处理
5.不管是否有异常都会执行finally程序,如果没有异常,执行完finally,继续执行下面程序
如果此时有异常没有更够处理(没有catch匹配)那么也会执行finally,但是执行完finally后,将默认交给jvm进行异常的信息输出,并且中断程序。
--Exception的使用
对象多态性来讲,所有的异常类都是Exception的子类,那么这个时候,实际上所有的异常都可以使用Exception进行接收。那么这个时候就应该可以感受到异常处理所带来的好处了。但是这种操作也存在一种问题。如果在一些异常处理要求严格的项目之中,异常必须分别处理,如果现在异常的处理要求不是很严格,直接编写Exception就足够
--throws关键字
throws关键字主要在方法定义()上使用,表示此方法不进行异常处理,而交给被调用处处理
a() throws Exception{} 方法定义上使用
// 下面调用处处理
try{
a();
}catch(Exception e){
e.printStackTrace();
}
调用有throws声明的方法的时候,一定要使用异常处理,这是强制性的,也可以继续主方法抛出异常(main方法上throws),由jvm进行处理
--throw关键字
之前的所有异常类都是由jvm自动进行实例化操作的,用户可以自己手工抛出一个实例化对象,就通过throw完成了
try{
throw new Exception("抛出异常");
}catch(Exception e){
e.printStackTrace();
}
--异常处理的标准格式
try…catch、finally、throws、throw
class MyMath {
// 出现异常要交给被调用处出,使用throws
public int div(int x,int y) throws Exception {
System.out.println("===== 计算开始 =====") ; // 资源打开
int result = 0 ;
try {
result = x / y ; // 除法计算
} catch (Exception e) {
throw e ; // 向上抛
} finally {
System.out.println("===== 计算结束 =====") ; // 资源关闭
}
return result ;
}
}
public class TestDemo {
public static void main(String args[]){
try {
System.out.println(new MyMath().div(10,0)) ;
} catch (Exception e) {
e.printStackTrace() ;
}
}
}
--RuntimeException
public static int parseInt(String s) throws NumberFormatException
这是parseInt方法抛出的异常,而我们在用这个方法的时候并没有处理这个异常 为什么呢?
看一下NumberFormatException的继承树
java.lang.Object
|- java.lang.Throwable
|- java.lang.Exception
|- java.lang.RuntimeException
|- java.lang.IllegalArgumentException
|- java.lang.NumberFormatException
发现NumberFormatException属于RuntimeException的子类,java中规定了对于RuntimeException异常类型,可以选择性处理,如果没有处理则交给jvm进行默认处理 。
请解释一下RuntimeException和Exception的区别?请列举出几个常见的RuntimeException:
· RuntimeException是Exception的子类;
· Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性的进行处理;
· 常见的RuntimeException:NumberFormatException、ClassCastException、NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException。
--断言:assert
断言指的是程序执行到某行之后,其结果一定是预期的结果,而在JDK 1.4之后增加了一个assert关键字。
范例:使用断言
public class TestDemo { public static void main(String args[]){ int x = 10 ; // 假设经过了若干操作 assert x == 30 : "x的内容不是30" ; System.out.println(x) ; } } |
默认情况下,Java之中的断言,不会在正常执行的代码中出现,如果要想启用断言,则应该增加一些选项:
java -ea TestDemo |
不过断言在开发之中几乎是不使用的技术,知道这个关键字就完了。
--自定义异常类
在Java之中本身已经提供了大量的异常类型,但是在开发之中,这些异常类型根本就不能满足于开发的需要。所以在一些系统架构之中往往会提供一些新的异常类型,来表示一些特殊的错误,而这种操作就称为自定义异常类,而要想实现这种自定义异常类,那么可以让一个类继承Exception或RuntimeException。
范例:自定义异常类
class MyException extends Exception { // 自定义异常类 public MyException(String msg) { super(msg) ; } } public class TestDemo { public static void main(String args[]) throws Exception { throw new MyException("自己的异常类") ; } } |
如果以后见到了一些特殊的没见过的异常类,基本上都表示自定义的。