一.异常处理
异常处理是继承Throwable的子类,有两种:Error 和 Exception.
Error是系统崩溃或者数据库崩溃,和代码的编写没有关系.
Exception是和代码有关系的,是一种异常.
二.解决方式
1.出现异常系统解决的办法:
以main函数为例:有两种方式
①.main函数自己解决
②.把问题抛给上级去解决(谁调用main函数就让谁解决)
main函数就会抛给jvm虚拟机处理.
jvm在控制台打印错误信息 和 错误发生在什么类的什么位置.
2.自己解决的办法:使用try…catch…捕获异常
结构:
try{
}catch{
}
捕获异常的流程:
①.程序发生异常
②.根据发生的异常 产生对应的异常对象
③.这个异常对象会返回给调用者
④.如果调用者处理了这个异常(添加了try…catch…方法)
异常对象会继续于catch中的语句进行匹配,如果匹配上了,就继续执行这个程序
⑤.如果调用者没有处理这个异常,那么就会默认交给jvm虚拟机处理,根据产生的异常对象打印错误信息,结束程序
3.多catch捕获异常
多catch捕获异常可以帮助你完善代码,让出现的异常更容易被找到.
如果还要使用Exception匹配异常,需要写在最后,不然写了详细匹配的catch就会失效了
代码举例:
public static void main(){
int[] array = {1,2,3,4,5};
try{
System.out.println(array[10]);
System.out.println(10/0);
}catch(ArithmeticException e){
System.out.println("除数为0了");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("数组越界了");
}catch(Exception e){
System.out.println("你出错了");
}
}
三.运行时异常和编译时异常
实际写代码时,不是运行时异常就是编译时异常
1.定义
运行时代异常:出现运行时代码就是你的代码有问题(程序员长犯的错误)
编译时异常:出现编译时异常系统会提前预警,强制你去处理,不处理编译都不会处理
2.解决方法
运行时异常前面都已经说过了.使用try…catch…或者抛给上级处理.
编译时异常其实就是系统这时候不知道你有没有这个文件,就相当于系统问你,要是没有这个文件怎么办,要求你做出解释,提前做出解决办法,这就是编译时异常.是对问题的一种提前准备.
解决办法;
①.自己处理,使用try…catch…
②.把异常抛出去(谁调用就抛给谁)
3.例题举例:
需求: 创建一个人类 name 和 age
要求: 人类的年龄赋值时 要在 0 到 100 岁 之间
public static void main(String[] args)throws Exception{
Person person = new Person();
person.setAge(-16);
System.out.println(person.getAge());
}
class Person{
private String name;
private int age;
// 无参/有参构造方法
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//set/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
// 如果这个方法 要抛出异常给调用者
// 必须在方法的声明中 标识这个方法为异常方法
// throw 和 throws 的区别?
// throw 是用来抛出一个异常对象(在方法中出现)
// throws 是用来标识一个方法 可以抛出一个异常(在方法的声明中出现)
public void setAge(String age)throws Exception{
if(age > 0 && age < 100){
this.age = age;
}else{
// 抛出一个异常 告诉输入的年龄有误
// 使用自定义类处理异常
AgeOutofBoundsException exception = new AgeOutofBoundsException("年龄有误");
// 把异常对象抛出去
throw exception;
// 使用匿名对象抛出异常
// throw new Exception("年龄有误");
}
}
// 重写toString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
class AgeOutOfBoundsException extends Exception{
// 序列化时 需要id
private static final long serialVersionUID = 1L;
public AgeOutOfBoundsException(){
super();
}
public AgeOutofBoundsException(String message)
{
super(message);
}
}
四.异常转移
当出现异常时,先捕获异常,但是无权处理.所以要将异常上抛,且进一步确定异常种类,然后上抛给可以处理的方法进行处理.