java 基础六---异常处理

一、异常的体系

  • Throwable 其实应该分三种
    • RuntimeException
      • RuntimeException 和其所有的子类,都不会在编译的时候报异常,而是在运行时报异常,这时候我们就需要回头看看我们的代码是否有问题,比如角标越界,空指针等
    • Exception
      • 除了 RuntimeException 和其所有子类,其他所有的异常类都是在编译的时候必须要处理的,要么try,要么抛
    • Error
      • 通常出现重大问题如:服务器宕机数据库崩溃等。不编写针对代码对其处理。

二、jvm是如何处理异常的

jvm发现运算是已经违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做ArithmeticException。
当除0运算发生后,jvm将该问题打包成了一个异常对象.并将对象抛给调用者main函数,new ArithmeticException("/by zero");

main函数收到这个问题时,有两种处理方式:
1,自己将该问题处理,然后继续运行
2,自己没有针对的处理方式,只有交给调用main的jvm来处理
jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上同时将程序停止运行。

三、处理异常处理方式

A.捕获异常:

try...catch(...)
try...catch(...)...finally
try...finally               是不能进行异常处理的,必须抛出

B.抛出异常: throws throw

throws:用于标识函数暴露出的异常。thorws用在函数上,后面跟异常类名(可以由多个,隔开)。
throw:用于抛出异常对象。throw用在函数内,后面跟异常对象。比如: new Exception();

public class Demo3_Throws {
    /**
     * try catch和throws的区别
     * 如果后续代码想要继续执行,只能try
     * 如果后续代码不想继续执行,只能throws
     * 
     */
    public static void main(String[] args){
        try{
                Person p = new Person();
                p.setAge(-17); //setAge方法抛出了异常所以必须捕获,或者继续往上抛
           }catch(Exception  ex){ }

        }

    class Person {
        private int age;
        public int getAge() {             
            return age;
        }
        public void setAge(int age) throws Exception {
          if(age > 0 && age < 200) {
              this.age = age;
          }else {
              throw new Exception("年龄非法");                           }
        }
     }

四、自定义异常

 自定义类继承Exception或者其子类(RuntimeException)

    class MyException extends Exception{
        MyException(){}

        MyException(String message){
            super(message); //将信息传递给父类,调用父类封装好的构造方法
        }
    }

    class Student {
        public void giveAge(int age) throws MyException {
            if(age>40 || age<16) {
                throw new MyExcetpion("建议不学了");
            }
            else {
                System.out.println("可以学习Java");
            }
        }
    }
   public static void main(String[] args){
        try{
                Student s = new Student ();
                p.giveAge(11); //giveAge方法抛出了异常所以必须捕获,或者继续往上抛
           }catch(MyException ex){
               System.out.println(ex.getMessage());//打印输出: 建议不学了
            }
        }
E:RuntimeException和Exception
    区别:RuntimeException就是要你改代码的。你可以不处理。

五、异常体系常见方法

A:getMessage() :返回此 throwable 的详细消息字符串。
B:toString():获取异常类名和异常信息,返回字符串。
C:printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
打印信息:
getMessage()=负数异常!
toString()=com.example.test3.MainActivity$MyException: 负数异常!

class Throwable {
    String detailMessage;
    Throwable(){}

    Throwable(String message) {
        this.detailMessage = message;
    }

    public String getMessage() {
        return detailMessage;
    }
}

.异常总结

  • RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明。
  • 子类覆盖父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。 
  • 如果父类抛出了多个异常,子类覆盖父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
  • 如果被覆盖的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
  • 当try对应多个catch时,最顶层的异常要放在最下面,反过来分析如果最顶层的异常放在第一行,那根据多态原理,后面的catch就没用了,一般面试的时候会这么问,开发的时候不会抛有继承关系的异常

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值