本文使用junit单元测试,如果不知道请学习junit单元测试
1.Error:
- java虚拟机无法解决的严重问题
- 例:jvm系统内部错误,资源耗尽等
2.Exception --常见异常
面试题?:常见的异常都有哪些,举例说明!
package com.fyp.servlet2;
import org.junit.jupiter.api.Test;
import java.util.Date;
public class ExceptionTEST {
@Test
public void test(){
//空指针异常
// int[] arr = null;
// System.out.println(arr[3]);
//数组索引越界
// int[] arr = new int[10];
// System.out.println(arr[9]);
//字符串脚标越界
// String str = "abc";
// System.out.println(str.charAt(3));
}
@Test
public void test1(){
//类型转换异常
// Object obj = new Date();
// String str = (String)obj;
//NumberFormatException
// String 类型转化int类型的时候,文本不能有其他字符
//
}
}
3.异常处理机制
异常处理,抓抛模型
一:“抛”,程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。
- 一旦抛出对象以后,其后的代码就不再执行
二:“抓”,异常处理的方式:1.try-catch-finally 2.throws
1.try-catch-finally的使用:
-
try{ //可能出现异常的代码 } catch (异常类型1 变量名1){ //处理异常的方式1 }catch (异常类型2 变量名2){ //处理异常的方式2 } finally{ //一定会执行的代码 }
-
finall ,是可选择性的写的,不一定非要写
-
try把可能出现的异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
-
一旦try中的异常对象匹配到某一个catch时,就进入catch异常处理,一旦处理完成就会跳出当前的try-catch结构(没有写finally的情况)。继续执行结构后面的代码
-
catch中的异常类型如果没有父子类关系,那么声明的顺序无关,如果有父子类关系,则要求子类一定在父类上面声明
-
常用的异常处理的方方式
- String getMessage()
- printStackTrace() 返回异常出现的地方-包含上一个
-
在try结构中声明的变量,出了try结构以后,就不能被调用。如果把变量声明到结构外部,就不会出现这个问题了
-
是可以选的,可以写也可以不写
-
finally中声明的是一定会被执行的代码,即使catch中又出现异常了,try中或者catch中有return语句,也不会影响finally代码的执行
-
像一些数据库连接,和输入输出流,网络编程scoket等资源,jvm不可以自当的回收,所以我们需要自己手动的进行资源的释放,这些操作就得是声明在finally中保证一定被执行
异常处理方式二:throws + 异常类型
-
写在方法声明处,指明此方法执行的时候,可能会抛出的异常类型
一旦方法体执行的时候,出现异常,任然会在异常代码处生成一个异常类的对象,此对象满足throws后面的异常类型的时候,就会被抛出。异常代码后面的代码则不再执行了
-
try-catch-finally:真的把异常给处理掉了
-
throws :只是把异常抛出了,抛给了方法的调用者。并没有真正的处理异常
重写方法异常抛出的规则:
-
子类重写的方法抛出的异常类型,不大于父类被重写方法抛出的异常类型
开发中如何选择使用try-catch-finally 还是使用throws?
-
如果父类中被重写的方法没有使用throws抛出异常,则子类重写的方法不能使用throws抛出异常,如果有异常,只能使用try-catch-finally方法进行处理
-
如果执行方法a中调用了b,c,d,e,f几个方法,建议这几个方法可以使用throws都交给a进行处理异常
throw关键字
-
关于异常对象的产生:
- 系统自动生成的异常对象
- 手动的生成一个异常对象,使用throw
-
package com.fyp.servlet2; public class throw_test { public static void main(String[] args) { try { Student s = new Student(); s.regist(-100); System.out.println(s); }catch (RuntimeException e){ System.out.println(e.getMessage()); } } } class Student{ private int id; public void regist(int id){ if (id>0){ this.id=id; }else{ throw new RuntimeException("输入的数据有误!"); } } @Override public String toString() { return "id等于"+id; } }
throw new RuntimeException("输入的数据有误!"); } } @Override public String toString() { return "id等于"+id; }
}
面试题:throw和throws的区别?
大家可以在评论区回复