- 对比Exception和Error
- 运行异常与一般异常区别
- ClassNotFoundException和NoClassDefFoundError有什么区别
- throw和throws
- 异常处理几点建议
- 自定义异常
对比Exception和Error。
Exception和Error都继承Throwable,
- Exception是程序可以处理的异常,正常JVM运行外的异常。
- Error一般是JVM相关异常错误,不可恢复状态,也不方便捕获。
运行异常与一般异常区别
Eeception又分为可检测异常(Checked Exception)和运行异常(也可叫不可检查异常,Runtime Exception)。
- 可检查异常(Checked Exception)在代码里必须显式地进行捕获处理,可以被处理的异常。如:IOException。
- 运行异常,类似NullPointerException,ArrayIndexOutOfBoundsException,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译器强制要求。
ClassNotFoundException和NoClassDefFoundError有什么区别
- ClassNotFoundException:Java动态加载类的时候,如果这个类在类路径中没有被找到或者当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类就会抛出ClassNotFoundException异常。类加载中加载时从外存储器找不到需要的class。
- NoClassDefFoudError,指要查找的类在编译的时候是存在的,运行的时候却找不到的异常错误。类加载中连接时从内存找不到需要的class。
throw和throws
public void custormException()throws CustomException{
throw new CustomException("抛出CustormException");
}
- throw作用域方法体内
- throws方法名后面
异常处理几点建议
- 只针对不正常的情况才使用异常,不需要异常处理的不要专门处理以增加系统额外检查降低性能。
try {
int i=0;
while (true) {
arr[i]=0;
i++;
}
} catch (IndexOutOfBoundsException e) {
}
- 抛出的异常要适合于相应的抽象
public E get(int index) {
try {
return listIterator(index).next();
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
- 不要忽略异常,避免使用空的catch语句
try {
...
} catch (SomeException e) {
}
- 异常保证输出堆栈信息,在异常消息中加入导致异常发生的全部信息
try {
...
} catch (SomeException e) {
System.out.println("12344");
}
自定义异常
一般根据项目需要自定义异常,特别是服务端处理业务的时候。一般自定义异常继承Exception,Throwable(因为Error一般用于JVM的异常错误,不常用自定义),因为异常已实现相关方法,只需重写构造方法就可以。代码如下:
- 继承Exception
public class CustomException extends Exception {
public CustomException() {
}
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable cause) {
super(message, cause);
}
public CustomException(Throwable cause) {
super(cause);
}
public CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
public class TestException {
public void testMethod(){
try {
custormException();
} catch (CustomException e) {
e.printStackTrace();
}
}
public void custormException()throws CustomException{
throw new CustomException("抛出CustormException");
}
public static void main(String[] args) {
TestException testException=new TestException();
testException.testMethod();
}
}
输出
com.mysiga.learn.throwable.CustomException: 抛出CustormException
at com.mysiga.learn.throwable.TestException.custormException(TestException.java:15)
at com.mysiga.learn.throwable.TestException.testMethod(TestException.java:9)
at com.mysiga.learn.throwable.TestException.main(TestException.java:19)
- 继承Throwable
public class CustomThrowable extends Throwable {
public CustomThrowable() {
}
public CustomThrowable(String message) {
super(message);
}
public CustomThrowable(String message, Throwable cause) {
super(message, cause);
}
public CustomThrowable(Throwable cause) {
super(cause);
}
public CustomThrowable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
public class TestThrowable {
public void testMethod(){
try {
custormException();
} catch (CustomThrowable e) {
e.printStackTrace();
}
}
public void custormException()throws CustomThrowable{
throw new CustomThrowable("抛出CustomThrowable");
}
public static void main(String[] args) {
TestThrowable testThrowable=new TestThrowable();
testThrowable.testMethod();
}
}
输出
com.mysiga.learn.throwable.CustomThrowable: 抛出CustomThrowable
at com.mysiga.learn.throwable.TestThrowable.custormException(TestThrowable.java:15)
at com.mysiga.learn.throwable.TestThrowable.testMethod(TestThrowable.java:9)
at com.mysiga.learn.throwable.TestThrowable.main(TestThrowable.java:19)
提示: 几种常见异常
ArithmeticException数学算数错误异常
ArrayIndexOutOfBoundsException数组越界
ClassCastException 类型转换异常
InputMismatchException用户输入异常
NullPointerException空指针异常
FileNotFoundException文件没有找到
IllageArgumentExceotion 非法的参数
1 异常:既是一种意外,是程序没有按照正常或期望的方式进行。
2 必须对检查型异常进行处理 SQLExceptions try -catchinally throws
3 final可选 catch可选但是二者不能同时为空
try:中的异常,系统(JVM虚拟机)自动检测是什么异常
catch的异常,是子父类的关系。产生异常,从上到下匹配.一定先捕获子类异常,再捕获父类异常。
catch最后一个异常,要用Exception进行拦截,拦截所有的异常
不希望后续的代码有影响
throws 异常之后的语句也不执行
异常被捕获的那条语句会执行,但不会输出结果,因为这句话有错误。不会执行。
String s;
try{
System.out.println("adfaf"+s.length);//会执行,但不会有结果,因为已经有错误
}catch(){
}
try -finally try中有错误,没有人去理会这个错误,因为会抛出异常没有人去管理他,后续的代码不会执行
将全部的代码放进try中,一条有错误整个后续程序都不会执行,很危险。只要有可能发生危险的地方用try-catch接受 或者像上抛出异常
4 执行过程
1)当Java程序执行try块,catch块的时候遇到了return 或throws语句,这两个语句都会导致该方法结束,
(2)但是系统执行这两个语句并不会结束该方法,而是去寻找异常处理中是否包含finally块,
(3)如果包含finally块,先去执行finally块----只有当finally块执行结束后系统才会再次跳回到try块和catch块里面的return或者throw,
(4)如果finally块也使用了return 或throw等导致该方法结束的语句,finally块已经终止了该方法,系统不会再跳回try块、catch块里面的任何代码;
所以我们尽量避免在包装类里面使用throw 或 return
5 检查型 非检查型异常
(1) 受检异常 ( 检查型异常)SQLExpection编译的时候就出现
java编译器在编译阶段就会抛出的异常。要求程序员必须捕获或声明抛出的异常
(2)运行时异常、上面的各种异常都是运行时异常; 运行的时候抛出异常
(3)Error不可恢复的异常,由JVM虚拟机抛出的不可逆转的异常
内存溢出 磁盘空间不足
6 实际开发中一般不会自己定义异常,会影响开发效率
自定义的异常要继承Exception类
7 throws向上抛出异常
8异常:自定义的异常必须显示抛出异常,否则程序虚拟机无法识别