java异常学习

一 异常的简介

  • 1.异常类型顶级类 Throwable, 所有的Error和Exception都是其的子类,其中error代表程序中致命的错误,是不可控的,不需要我们额外的关注,
    但是Exception是我们预料之中可能会出现的错误,有些我们需要处理
  • 2.Exception又分为受检查类型的异常和不受检查类型的异常,就是说,有些异常在编译时就需要我们处理,这些异常不处理编译是不通过的,
    所以称之为受检查异常(非运行时异常),而在编译时不需要处理的异常,不影响程序的编译的异常则被称之为不收检查类型的异常(运行时异常)

二 常见的非运行时异常举例

  • 1.操作数据库异常:SQLException
  • 2.输入输出异常:IOException
  • 3.文件未找到异常:FileNotFoundException

三 常见的运行时异常RuntimeException举例

  • 1.ArithmeticException 算数运算异常,由于除数为0引起的异常;
  • 2.ClassCastException 类型转换异常,当把一个对象归为某个类,但实际上此对象并不是由这个类创建的,也不是其子类创建的,则会引起异常;
  • 3.NullPointerException 空指针异常,程序试图访问一个空的数组中的元素或访问空的对象中的方法或变量时产生异常;
  • 4.IndexOutOfBoundsException 索引越界异常,由于数组下标越界或字符串访问越界引起异常;

四 java异常的处理

  • Java的异常处理通过5个关键字来实现:try、catch、throw、throws 和 finally。try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws语句用于声明可能会出现的异常。

五 多重捕获

当捕获的多个异常类之间存在父子关系时,捕获异常时一般先捕获子类,再捕获父类。所以子类异常必须在父类异常的前面,否则子类捕获不到。

  • 1.异常的捕获应该从小到大,因为代码的顺序是从上到下,所以捕获的的时候小的分类应该写在前面,这样所有的catch都有可能进入,如果小的写在后面,那么就可能永远都进不去,这样的的话多重捕获实际上也就没有什么意义了,实际上在使用idea时,如果写的方式不是从小到大,编译也是会报错的,如 Exception ‘java.lang.ArithmeticException’ has already been caught
  • 2.在有多个catch的情况下,一旦进入了某个catch,那么后面的异常就都不会进了
 @Test
    public void test1() {
        try {
            int i=4/0;
            System.out.println(i);
        }
        catch (ArithmeticException e) {
            System.out.println("是ArithmeticException类型的异常");
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * java.lang.ArithmeticException: / by zero
         * 	at myThrowAble.demo01.test1(demo01.java:24)
         * 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         * 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
         * 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
         * 	at java.lang.reflect.Method.invoke(Method.java:483)
         * 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
         * 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
         * 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
         * 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
         * 	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
         * 	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
         * 	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
         * 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
         * 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
         * 	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
         * 	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
         * 	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
         * 	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
         * 	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
         * 	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
         * 	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
         * 	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
         * 	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
         * 	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
         * 	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
         * 	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
         */
    }```

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值