异常
异常概述:异常是Java程序运行过程中出现的错误
异常分类:API查找Throwable
1.Error(服务器宕机,数据库崩溃等)
2.Exception C(异常的继承体系)API查RuntimeException
运行时异常:一般是程序员的错误异常可以让我们发现错误并修改
编译时异常:Exception下除了RuntimeException其他都是编译时异常 在写代码时就要处理掉 不然编译不通过
异常处理的两种方式
1.try catch(抓取)
try catch finally
2.throws(抛出) //直接抛给Jvm java虚拟机执行 缺点:程序会终止
try...catch处理异常的基本格式 try…catch…finally
通过 try{}carch(){} 把问题处理后程序会继续执行
public static void main(String[] args) {
try{
int a=10;
System.out.println(a/0);
}catch(ArithmeticException e){
//ArithmeticException类 中重写了Object中的toString()
e=new ArithmeticException("不能除0");
System.out.println(e);
}finally{
//这里的代码不管有没有抓取异常都会执行
}
//通过 try{}carch(){} 把问题处理后程序会继续执行
System.out.println("出现异常行以下的程序-----------------------------------------");
}
开发常用:
异常 名字.printStackTrace();
//打印堆栈信息 输出异常名字和问题的原因 以及问题出现在某个类中某一行
例:java.lang.ArrayIndexOutOfBoundsException: 7
at com.muzhou.lesson.exception.Demo02.main(Demo02.java:8) //异常代码位置
类中抛异常案例:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws Exception {
if(age>0&&age<=120){
this.age = age;
}else{
//抛出异常
/* try{
throw new Exception();
}catch( Exception e){
e=new Exception("年龄非法");
System.out.println(e);
}*/
throw new Exception();//不处理异常 再次往方法上抛出 使用场景:在数据库
}
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Person p=new Person();
p.setName("张三");
try{
p.setAge(130);//调用者被告知这个方法中有异常抛出 传值调用要注意 让调用者来处理
}catch(Exception e){
e.printStackTrace();
}
System.out.println(p);
}
public void setAge(int age) {
if(age>0&&age<=120){
this.age = age;
}else{
throw new RuntimeException("年龄非法");//运行异常 不需要手动处理 由jvm默认的异常处理机制处理
}
}
throw和throws的区别
throw:在功能方法内部出现某种情况 程序不能继续运行 需要跳转时 就用throw把异常对象抛出
1.用在方法体内 跟的是异常对象
2.只能抛出一个异常对象名
3.表示抛出异常 由方法体内的语句处理
throws:
1.用在方法声明后面 跟的是异常类名
2.可以根多个异常类名 用逗号隔开
3.表示抛出异常 由该方法的调用者处理
自定义异常:
自定义异常是给了异常名字 可以更好的识别异常解决问题
自定义异常继承Exception 继承自RuntimeException
public class AgeException extends Exception{
//自定义编译异常
public AgeException() {
super();
}
public AgeException(String s) {
super(s);
}
}
public class AgeRuntimeException extends RuntimeException{
//自定义运行时异常
public AgeRuntimeException() {
super();
}
public AgeRuntimeException(String s) {
super(s);
}
}
注意:
子类继承父类 不能抛出>父类的异常 只能抛出<=父类的异常
父类没有抛异常 子类不允许抛异常