------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
异常
1、
2、Error和Exception的区别
Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行外别无选择。
Exception(异常)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
3、程序抛出了异常,会使原本的程序代码不执行。如果希望程序出现了异常后,仍然可以正常完成的话,那么就可以使用如下的格式进行异常的处理。
4、异常处理——格式1
try{
可能出现异常的语句;
}
[以下可选]
catch(异常类型 异常对象){
处理异常;
}
catch(异常类型 异常对象){
处理异常;
}
……
[结束]
[以下可选]
finally{
不管是否出现异常,都执行此代码;
}
[结束]
特别注意!在java中,所有捕获范围小的异常,必须放在捕获范围大的异常前面,否则程序编译报错。因为捕获范围小的异常永远无法被执行到。
5、异常处理——格式2
try、catch、finally、throw、throws格式。交给被调用出处理
代码示例:
class MyMath{
public int div(int x,int y) throws Exception{
System.out.println("===start===");
int result=0;
try{
result=x/y;
}catch(Exception e){
throw e;
}finally{
System.out.println("===end===");
}
return result;
}
}
public class Demo22 {
public static void main(String[] args) {
try{
System.out.println(new MyMath().div(10, 0));
}catch(Exception e){
System.out.println("出错了");
}
}
}
运行结果:
===start===
===end===
出错了
6、异常的处理流程步骤
(1)如果程序中产生了异常,那么JVM会自动的根据异常的类型new一个指定异常类的对象。
(2)如果程序中没有进行任何异常处理操作(try、catch),则这个异常类的实例化对象将交给JVM进行处理。JVM的默认处理方式就是进行一场信息的抛出,而后中断程序的执行。
(3)如果程序中存在了异常处理,会由try语句捕获产生的异常类对象。
(4)与try之后的每一个catch进行匹配。如果匹配成功,则使用指定的catch进行处理;如果匹配失败,则向后面的catch继续匹配;如果没有任何catch匹配成功,将交给JVM执行默认处理。
(5)不管是否有异常,都会执行finally程序。如果此时没有异常,执行完finally会继续执行程序中的其他代码;如果此时有异常没能处理(没有一个catch可以满足),那么也会执行finally,但是执行完finally后,将默认交给JVM进行异常的信息输出,并且程序中断。
7、throws:主要是在方法定义上使用的,表示此方法中不进行异常的处理,而交给被调用处处理。
在调用throws声明的方法时(抛出的是RuntimeException例外),一定要在这种方法的被调用处进行异常处理(try、catch)或者继续向上throws。这属于强制性处理。
8、throw:之前所有的异常类对象都是由JVM自动进行实例化操作的,现在用户也可以自己手动抛出一个实例化对象。通过throw完成。
你手动抛出了一个异常(RuntimeException除外),要么进行异常处理(try、catch);要么在方法定义上继续向上throws!
9、手动抛异常的代码示例:
public class Demo22 {
public static void main(String[] args)throws Exception {
try{
throw new Exception("抛着玩的,你管不着");
}catch(Exception e){
throw e;
}
}
}
运行结果:
Exception in thread "main" java.lang.Exception: 抛着玩的,你管不着
atDemo22.main(Demo22.java:5)
10、常见面试题分析:在try与剧中有一个return语句,那么紧跟在这个try后的finally语句的代码会不会执行?什么时候被执行,在return前还是return后?
答:finally语句一定会执行,并且是在return前执行。
11、RuntimeException
RuntimeException也属于Exception的子类。
代码示例:
public class Demo22 {
public static void main(String[]args)throws Exception {
String str = "123";
int num = Integer.parseInt(str);
System.out.println(num*num);
}
}
运行结果:15129
看一下Integer类的parseInt()方法的定义。
public static int parseInt(String s)throwsNumberFormatException。这个方法抛出了一个NumberFormatException异常。按照之前所讲,如果存在throws,就必须在被调用处进行异常处理(try、catch)或者在方法声明上继续向上throws。但现在没有强制要求处理,并且程序可以正常运行。这是为什么呢?
因为NumberFormatException属于RuntimeException的子类,而对于RuntimeException的异常类型,可以有选择性的进行处理。在开发中,如果没有处理,出现异常后将交给JVM默认进行处理。
12、常见面试题:请解释RuntimeException和Exception的区别,试列举几个常见的RuntimeException。
答:异常(Exception)表示程序运行过程中可能出现的非正常状态,运行时异常(RuntimeExceprion)表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的费运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。即LException定义了必须处理的异常,而RuntimeException定义的异常可以选择性的进行处理。
RuntimeException是Exception的子类。
常见的RuntimeException有NumberFormatException、ClassCastException、NullPointerException、ArithmeticException和ArrayIndexOutOfBoundsException。
13、自定义异常
自定义异常,可以让一个类继承Exception(必须处理)或RuntimeException(选择处理)。
代码示例:
class MyException extends Exception{
public MyException(Stringmsg){
super(msg);
}
}
public class Demo22 {
public static void main(String[]args)throws Exception {
throw new MyException("自己定义的异常");
}
}
运行结果:
Exception in thread "main" MyException: 自己定义的异常
atDemo22.main(Demo22.java:4)
14、小结
(1)异常时导致程序中断运行的一种指令流,当异常发生时,如果没有进行良好的处理,则程序将会中断执行。
(2)异常的最大父类是Throwable,它分为两个子类:Exception和Error。Exception表示程序处理的异常。而Error表示JVM错误,一般不由程序开发人员处理。
(3)throws用在方法声明处,表示本方法不处理异常。
(4)throw表示在方法中手动抛出一个异常。
(5)自定义异常类时,只需要继承Exception类或RuntimeException类即可。