java中关于异常的一些小知识点和代码分享

东西好多啊

异常是指在程序运行过程中所发生的不正常的事件,它会中断正在运行的程序。

首先是一个除法的小程序
那么如果除数是0 或者说你输入的除数和被输出不是数字 是字母啥的 那肯定会报错

public class Error1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("一个除法运算小程序");
        System.out.println("请输入被除数");
        int n1 = in.nextInt();
        System.out.println("请输入除数");
        int n2 = in.nextInt();
        System.out.println(n1+"/"+n2+"="+n1/n2);
        System.out.println("感谢使用");
    }
}

运行结果:
一个除法运算小程序
请输入被除数
a
Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at Error1.main(Error1.java:9)

//如果输入不是数字 输入格式异常 inputMismatchException
//如果输入是0     运算异常     ArithmeticException
//Exception是所有异常的父类

可以用传统的if来判断 修改代码 当然这里只改了除数 还没有改被除数 可以看到代码已经长了很多

class Error2{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("一个除法运算小程序");
        System.out.println("请输入被除数");
        int n1 = in.nextInt();
        System.out.println("请输入除数");
        int n2 = 0;
        if (in.hasNextInt()){     //判断输入的是不是整数
            n2 = in.nextInt();
            if (n2==0){              //用户输入了0
                 System.err.println("除数不能是0!有没有脑子???");
                 System.exit(1);        //退出JVM,括号里非0代表异常终止
            }
            else{
                System.out.println(n1+"/"+n2+"="+n1/n2);
                System.out.println("感谢使用");
            }
        }
        else{
            System.err.println("你输入的不是整数,我不会算!");
            System.exit(2);
        }
    }
}

运行结果:
一个除法运算小程序
请输入被除数
100
请输入除数
a
你输入的不是整数,我不会算!

简单的用try和catch来处理异常
把可能出现的异常套在try里面
然后用catch逮住出现的异常

class Error3{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("一个除法运算小程序");
        System.out.println("请输入被除数");
        try {          //尝试执行 但是可能会出现异常的代码
            int n1 = in.nextInt();
            System.out.println("请输入除数");
            int n2 = in.nextInt();
            System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
            System.out.println("感谢使用");
            }catch(Exception e){   //捕获异常 队异常进行处理   e是一个对象名 随便取
            System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
            System.exit(1);
        }
    }
}
运行结果:
一个除法运算小程序
请输入被除数
A
你真笨 又错了 被除数和除数必须为整数且不为0

printStackTrace这个方法可以输出异常的堆栈信息
可以看到错误是在83行 一点下就能直接过去
并且可以看到 / by zero 说明是除法除了0导致错误
getMessage也有类似功能

class Error4{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("一个除法运算小程序");
        System.out.println("请输入被除数");
        try {          //尝试执行 但是可能会出现异常的代码
            int n1 = in.nextInt();
            System.out.println("请输入除数");
            int n2 = in.nextInt();
            System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
            System.out.println("感谢使用");
        }catch(Exception e){   //捕获异常 队异常进行处理   e是一个对象名 随便取
            System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
            //System.exit(1);   比较极端的处理方式 直接终止JVM
            e.printStackTrace();   //输出异常的堆栈信息
        }
        System.out.println("溜了溜了");
    }
}
运行结果:
一个除法运算小程序
请输入被除数
100
请输入除数
0
你真笨 又错了 被除数和除数必须为整数且不为0
java.lang.ArithmeticException: / by zero
	at Error4.main(Error1.java:83)
溜了溜了
class Error6{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        try {          //尝试执行 但是可能会出现异常的代码
//            System.out.println("输入数组的长度");
//           int n1 = in.nextInt();  //输入数组的长度
//            System.out.println("输入数组中的数");
//            int[] n2 = new int[n1];  //
//            for ( int i =0; i < n1; i++) {
//                n2[i] = in.nextInt();
//            }
//            System.out.println(n2[5]);
            //ArrayIndexOutOfBoundsException 数组下标越界
            String a = null;
            System.out.println(a.equals("我是老王"));


            //NullPointerException   空指针异常
            // return;   return本来会直接跳出方法 但是这里会先finally 再return 可打断点看

        }catch(Exception e){   //捕获异常 队异常进行处理   e是一个对象名 随便取
            System.err.println("你真笨 又错了 ");
            //System.exit(1);   比较极端的处理方式 直接终止JVM
            e.printStackTrace();   //输出异常的堆栈信息
            System.out.println(e.getMessage());   //返回异常信息的描述字符串 是printStackTrace的一部分
            return; //return本来会直接跳出方法 但是这里会先finally 再return 可打断点看
        }finally {          //catch和finally必须出现其中一个
            System.out.println("溜了溜了");
        }
    }
}

catch的异常从子类和同级再到父类
从上往下 逮到一个就不会再逮了
例如

class Error7{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("一个除法运算小程序");
        System.out.println("请输入被除数");
        try {          //尝试执行 但是可能会出现异常的代码
            int n1 = in.nextInt();
            System.out.println("请输入除数");
            int n2 = in.nextInt();
            System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
            System.out.println("感谢使用");
        }catch(ArithmeticException e){       //先子类后父类  逮到就不逮了
            System.out.println("除数异常");
        }
        catch(Exception e){   //捕获异常 队异常进行处理   e是一个对象名 随便取
            System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
            //System.exit(1);   比较极端的处理方式 直接终止JVM
            e.printStackTrace();   //输出异常的堆栈信息
            System.out.println(e.getMessage());   //返回异常信息的描述字符串 是printStackTrace的一部分
        }finally {          //catch和finally必须出现其中一个
            System.out.println("溜了溜了");
        }

    }
}

可以再方法里用throws抛出异常

class Error8{
    public void error1 () throws ArithmeticException,InputMismatchException{
        Scanner in = new Scanner(System.in);
        System.out.println("一个除法运算小程序");
        System.out.println("请输入被除数");
        int n1 = in.nextInt();
        System.out.println("请输入除数");
        int n2 = in.nextInt();
        System.out.println(n1 + "/" + n2 + "=" + n1 / n2);
        System.out.println("感谢使用");
    }


    public static void main(String[] args) {
            Error8 er = new Error8();
        try {          //尝试执行 但是可能会出现异常的代码
             er.error1();
        }catch(ArithmeticException e){       //先子类后父类  逮到就不逮了
            System.out.println("除数异常");
        }catch(InputMismatchException e){
            System.out.println("输入格式异常");
        }
        catch(Exception e){   //捕获异常 队异常进行处理   e是一个对象名 随便取
            System.err.println("你真笨 又错了 被除数和除数必须为整数且不为0");
            //System.exit(1);   比较极端的处理方式 直接终止JVM
            e.printStackTrace();   //输出异常的堆栈信息
            System.out.println(e.getMessage());   //返回异常信息的描述字符串 是printStackTrace的一部分
        }
        finally {          //catch和finally必须出现其中一个
            System.out.println("溜了溜了");
        }
    }
}

throw可以手动抛出一个异常(就是也可新建一个自定义异常)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值