1、java异常的处理流程
2、异常分类
Error(表示JVM错误,一般不由程序开发人员处理)
Runtime Exception 运行时异常
Exception(表示程序处理异常)
throw 用户自定义异常
3、常见的RuntimeException类
NullPointerException:空指针异常;
NumberFormatException:字符串转换数字异常;
ArrayIndexOutOfBoundsException:数组越界;
StringIndexOutOfBoundsException:字符串越界;
ClassCastException:类型转换错误;
UnsupportedOperationException:该操作不被支持;
ArithmeticException:算术错误;
IllegalArgumentException:非法参数,在把字符串转换成数字的时候经常出现的一个异常;
IllegalArgumentException和NumberFormatException的区别
4、其他常见异常:
ClassNotFoundException 指定类不存在
IndexOutOfBoundsException 数组下标越界异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法不存在异常
IOException IO 异常
SocketException Socket 异常
5、Exception,RuntimeException和Error的区别
Exception:在程序中必须使用try...catch进行处理。表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
RuntimeException:其特点是Java编译器不去检查它,可以不使用try...catch进行处理,但是如果有异常产生,则异常将由JVM进行处理,如果出现RuntimeException,那么一定是程序员的错误。
Error:一般为底层的不可恢复的类,一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception分为RuntimeException类,和非RuntimeException类;
Error和RuntimeException及其子类称为未检查异常(Unchecked exception),
Exception的非RuntimeException类称为受检查异常(Checked Exception)。编译是通不过的。这类异常一般是外部错误,例如文件找不到、试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
6、throw 和 throws 的区别?
throw:用于主动抛出java.lang.Throwable 类的一个实例化对象。用来抛出任意异常的,你可以抛出任意 Throwable(意思是说你可以通过关键字 throw 抛出一个 Error 或者 一个Exception),包括自定义的异常类对象;
throws:是声明可能会抛出一个异常(作为方法声明和签名的一部分)。总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。如果方法抛出了异常,那么调用这个方法的时候就需要处理这个异常。
7、final、finally、finalize 有什么区别?
final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。
finally:是 try{} catch{} finally{} 最后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果 finally 部分存在,则一定会执行 finally 里面的代码。
finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
8、try-catch-finally 中哪个部分可以省略?
try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同时省略,也就是说有 try 的时候,必须后面跟一个 catch 或者 finally。
9、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
finally 一定会执行,即使是 catch 中 return 了,catch 中的 return 会等 finally 中的代码执行完之后,才会执行。