zoukankan      html  css  js  c++  java
  • java异常(转)

    Throwable(所有error和exception的父类:超类)

    Java将错误变成对象交给异常处理机制

    Error(仅靠程序本身无法恢复的严重错误)

    一般是环境的问题,JVM的问题,并非程序的问题;最典型的就是虚拟机中运行的程序过多,造成的虚拟机内存溢出,虚拟机错误,还有系统崩溃之类的,应用程序是无法处理此类错误的。Error不在我们调试代码可以处理的范围中。

    AWTError

    ThreadDeath

    ...  ...

    Exception(由java应用程序抛出和处理的非严重型错误)

    Checked异常(检查时异常),程序必须处理的异常(代码调用,调用方声明有风险)

    SQLException

    ClassNotFoundException

    ......

    例如文件调用:I/O 有可能找不到的风险

    对于以上的文件读取可能发生的异常我们有两种处理方式:

    1.    抛出,继续往上抛

    2.    现场处理这个异常
     
     

    运行时异常,不要求程序必须对它们做出处理(运行时才能抛出异常)

    RuntimeException(运行时错误)

    NullPointerException

    对象没有被初始化生成的

    NumberFormatException
    ArrayIndexOutOfBoundsException
    数组越界错误

    ......

    ArithmeticExecption

    数学异常(类似除零错误):

     

    Java中的异常处理是通过5个关键字来实现的:

    捕获

    try: 执行可能产生异常的代码

    Catch: 异常捕获

    Finally: 无论是否发生异常总能执行的代码

    抛出

    Throw: 手动抛出异常

    Throws: 声明方法可能要抛出的各种异常

    使用try、catch、finally的三种情况:

    1.程序正常运行(不经过catch):

    2.程序发生异常,经过catch且异常匹配:

    3.程序发生异常,但是不能被catch和catch的不匹配:

    如果出现不能被catch那么程序就会报错,将异常往上抛,抛给JVM。

    上面讲的是一段代码只有一种异常的最简单的情况;更多的时候一段代码不止一种异常:

    这里的try中有多行代码,可能出现的异常有多种:数学异常,String字符串的空指针异常,在try中如果出现了异常时,会在catch中寻找对应可以解决的catch块,但是如果将exception放在三个catch的最前面,就会报错,因为exception是所有异常的超类,出现异常必然会进入到exception中,后面的两个catch就会失效了

    使用throw和throws:

    在java本身的语法中就是对异常执行抛出的动作,java本身的语法 会把异常一层一层的往上抛,方法中出现了异常,则会把异常抛给调用它的主函数,主函数无法解决,就会把异常再次往上抛出,最后抛到JVM导致JVM死掉。

    使用throws抛出的运行时异常相当于提示调用者,该方法有风险,至于是否处理该风险,由调用者决定;如果throws抛出的是检查时异常,那么调用者自己就必须在调用的时候进行处理(利用try ... catch),当然通过throws可以同时抛出多个异常.

     

    ------------------------------异常案例------------------------------------

    package javaexception;

     

    publicclassExceptionTest1{

      publicstaticvoidmain(String[]args){

        Workerworker=newWorker();

        try{

          worker.work(11);

        }catch(Exceptione){

          Doctordoctor=newDoctor();

          try{

            doctor.cure(worker);

            System.out.println("治好了");

          }catch(Exceptione1){

            System.out.println("die");

          }

        }

       

      }

    }

     

     

    classWorker{

      privatebooleanalive=true;

     

      publicbooleanisAlive(){

        returnalive;

      }

     

      publicvoidsetAlive(booleanalive){

        this.alive=alive;

      }

     

      //工作的方法

      publicvoidwork(intcount)throwsException{

        if(count>10){

          thrownewException("生病");

        }else{

          System.out.println("正常工作");

        }

       

      }

     

    }

     

    classDoctor{

      publicvoidcure(Workerworker)throwsException{

        intt=(int)(Math.random()*10000);

        if(t==4512){

          worker.setAlive(false);

          thrownewException("death");

        }else{

          worker.setAlive(true);

        }

       

      }

     

    }

    --------------------------------------------

    运行时异常:

    捕获:

     

    特别提醒:在try... catch...  finally中 finally最好不省略,因为finally是保证程序是否发生异常,都必须执行的代码(即使我们在try块中强行return之后,finally中依然会执行),(例如我们在I/O流里面,必须做的关闭操作就应该放在finally中)  ||需要强调的是:唯一能终止finally执行的操作就是 System.exit(0);及其它相关类似操作,这一类操作是直接终止程序的运行,关闭JVM。

    如果在finally中发生异常的话,照样也会程序中断,因为没有人处理这个异常。

    抛出:

    Throw表示手动抛出一个异常,throws是声明该方法可能会抛出的异常(运行时异常调用者不用必须处理;只是知道这里会抛出这样一个异常)

    检查时异常:

    捕获:

    printStackTrace是打印异常堆栈,但是一般我们不建议打印异常堆栈(IDE工具里JVM默认生成的),具体问题具体处理,一层一层的打印堆栈是比较耗性能的。

    抛出:

    如果抛出的是检查时异常那么就必须被处理,要么在手动抛出的地方立马用try catch进行处理,要么继续往上抛,抛给调用这个方法的方法或者主函数,如下例:

     

  • 相关阅读:
    品尝阿里云容器服务:负载均衡与容器的关系
    基于微服务架构、运行于容器中的.NET Core示例应用eShopOnContainers
    基于VS2017的Docker Support体检ASP.NET Core站点的Docker部署
    用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
    终于知道什么情况下需要实现.NET Core中的IOptions接口
    ASP.NET Core Web API处理HttpResponseMessage类型返回值的问题
    ASP.NET Core奇遇记:无用户访问,CPU却一直100%
    省一行是一行:在if语句中使用C# 7.0的模式匹配
    ASP.NET Core 2.0 Preview 1 中贴心的新特性
    .NET Core类库项目中如何读取appsettings.json中的配置
  • 原文地址:https://www.cnblogs.com/wangyufei123/p/8448896.html
Copyright © 2011-2022 走看看