异常之如何玩好异常

异常

一.什么是异常

  • 异常:在java中将程序执行中发生不正常的情况称为异常
    • String a =10 叫做语法错误,不叫异常
  • Error异常:虚拟机无法解决的问题
    • eg:递归中,值太大,超出虚拟机范围
  • Exception异常:编译错误,且程序可以处理的

1.数组越界 java.lang.ArrayIndexOutOfBoundsException

        int[] a = new int[5];
        a[5] = 10;

2.空指针异常 java.lang.NullPointerException

        String a = null;
        a.length();

3.类型转换异常 java.lang.ClassCastException

        Object a = "abc";
        Integer i = (Integer) a ;

4.数字格式化异常 java.lang.NumberFormatException

new Integer("abc");

5.算术异常 java.lang.ArithmeticException

        int a = 10;
        int b = 0;
        System.out.println(a/b);

二. 异常分为运行期异常,编译期异常

1.try,catch

        //算术异常  java.lang.ArithmeticException
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);
        } catch (ArithmeticException e) {
            //打印输出异常信息,记录日志
           /* System.out.println(e.getMessage());
            e.printStackTrace();//打印异常信息到控制台*/

            PrintWriter p = new PrintWriter("E:\\log.txt");
            e.printStackTrace(p);
            p.flush();
            p.close();

            System.out.println("操作失败");//用户进行提示,通过一些日志组件
        }
        System.out.println("运行接下来的代码");

2.finally

无论是否发生异常,代码依然执行

    //finally无论是否发生异常,代码依然执行
        Dome2 y = new Dome2();
        System.out.println(  y.x(10,0));
    }
    /*
    try{}
    finally{}
    try没有处理异常,一旦try出现问题,执行finally,程序终止
    不管try有没有处理异常,也有return,也优先执行finally
     */
    public int x(int a,int b){
        try{
            int c ;
            c = a / b ;
            return c;
        }catch (ArithmeticException e){
            return -1;
        }finally {
            System.out.println("牛皮");
        }

3.throws

  • throws:作为方法的声明,声明此方法中可能出现的某种异常
    • 这个多为编译异常
    • main方法里必须是try catch
    • 谁调用谁用throws
       Dome3 s2 = new Dome3();
        try {
            s2.s();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public void s () throws UnsupportedEncodingException {
        this.s1();
    }

    public  void s1 () throws UnsupportedEncodingException {
        "abc".getBytes("utf-8");
    }

4.抽象方法写的异常,子类继承时也要写

public abstract class Dome4 {
    //throws后面这个在父类中范围必须大于或等于子类继承的Exception
    public abstract void s () throws Exception;

    public abstract void s1 ();

    public abstract void s2 ();


}
public class Dome5 extends Dome4{
    @Override
    public void s() throws UnsupportedEncodingException {
        "abc".getBytes("utf-8");
    }

    @Override
    public void s1() {

    }

    @Override
    public void s2() {

    }
}

5. throw 运行期,捕获一个异常对象

  在不满足某种条件时,在方法中显示抛出一个异常对象,程序终止
public class Dome6 {
    public static void main(String[] args) {
        Dome6 d = new Dome6();
        try {
            d.x(120);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public String x(int y) throws Exception {
        if (y>100||y<0){
            throw new Dome7("数字太大");//Dome7是自定义异常,根据实际业务逻辑要求,指定一种场景的异常
        }
        if (y>90){
            return "优秀";
        }else{
            return "失败";
        }
    }
}
  • Dome7是自定义异常,根据实际业务逻辑要求,指定一种场景的异常
    • Dome类继承Exception类
    • 在这里通过有参构造函数,进行判断,如果值不满足条件,则输出异常
public class Dome7 extends Exception{
    public Dome7() {
    }

    public Dome7(String message) {
        super(message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值