Java中的异常

本文详细解释了Java中的异常概念,包括异常的定义、作用,以及异常在Java中的类和对象形式。讨论了编译时异常和运行时异常的区别,以及如何通过throws和catch语句进行异常处理。同时介绍了UML在异常处理中的应用和Java中异常对象的方法。
摘要由CSDN通过智能技术生成

 1.什么是异常,java提供异常处理机制有什么用?

   以下程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常

java语言是很完善的语言,提供了异常的处理方法,以下程序执行过程中出现了不正常的情况,Java把

该异常信息打印输出到控制台,供程序员参考,程序员看到异常信息之后,可以对程序进行修改,让程

序更加健壮。

  什么是异常:程序执行过程中的不正常情况

  异常的作用:增强程序的健壮性

2.异常信息出现在控制台上,是JVM打印的

 public class ExceptionTest01{

    public static void main(String[] args){

      /*

        int a=10;

        int b=0;

 //实际上JVM在执行到此处的时候,会new异常对象:new ArithmeticException("/by zero");

//并且JVM将new异常对象抛出,打印输出信息到控制台了

        int c=a/b;

        System.out.println(a+"/"+b+"="+c);

     */

     //观察到异常信息之后,对程序进行修改,更加健壮。

    int a=10;

    int b=2;

    if(b==0){

       System.out.println("除数不能为0"):

       return;

    }

    //程序执行到此处表示除数一定不是0

   int c=a/b;

   System.out.println(a+"/"+b+"="+c);

   }

}

java语言中异常是以什么形式存在的呢?

  1.异常在java中以类的形式存在,每一个异常类都可以创建异常对象

  2.异常对应的现实生活中是怎么样的?

     火灾(异常类);

        2008年8月8日,小明家着火了(异常对象)

        2008年8月9日,小红家着火了(异常对象)

        2008年8月10日,小刚家着火了(异常对象)

    类是:模板

    对象是:实际存在的个体

  

  public class ExceptionTest02{

     public static void main(String[] args){

        //通过”异常类”实例化“异常对象”

        NumberFormatException nfe = new NumberFormatException("数字格式化异常“);

       //java.lang.NumberFormatException :数字格式化异常

       System.out.println(nfe);

       //通过”异常类“创建”异常对象“

       NullPointerException npe = new NullPointException("空指针异常发生了!”);

       //java.lang.NullPointerException:空指针异常发生了

       System.out.println(npe);

    }

}

 1.Java的异常处理机制

   1.1异常在java中以类和对象的形式存在,那么异常的继承结构是怎样的?

我们可以使用UML图来描述一下继承结构。画UML图有很多工具,例如:Rational Rose(收费)starUML等…

   Object

   Object下有Throwable(可抛出的)

   Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)

   Exception下有两个分支:

       Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)

       RuntimeException:运行时异常(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

   1.2编译时异常和运行时异常,都是发生在运行阶段,编译阶段异常是不会发生的。

 编译时异常因什么而得名呢?

      因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器会报错,因此得名。

 所有的异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。 因为异常的发生就是new异常对象。

  1.3编译时异常和运行时异常的区别?

   编译时异常一般发生的概率比较高。

      举个例子:你看到外面下雨了,倾盆大雨的。你出门之前会预料到,如果不打伞,我可能会生病(生病是一种异常)。而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。“拿一把伞”就是对“生病异常”发生之前的一种处理方式。

      对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

   运行时异常一般发生的概率比较低。

      举个例子:

          小明走在大街上,可能会被天上的飞机轮子砸到。被飞机轮子砸到也算是一种异常。但是这种异常发生概率较低。在出门之前你没必要提前对这种概率较低的异常进行预处理。如果你预处理这种异常,你将活得很累。

  假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?

    首先,如果这样的话,程序肯定是绝对的安全的。但是程序员编写程序太累,代码到处都是处理异常的代码。

 1.4编译时异常还有其他的名字:

       受检异常:CheckedException

       受控异常

  1.5运行时异常还有其他名字:

       未受检异常:UnderCheckedException

       非受控异常

  1.6再次强调:所有异常都是发生在运行阶段的

  1.7Java语言对异常的处理包括两种方式:

       第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。 谁调用我,我就抛给谁。

       第二种方式:使用try..catch语句进行异常的捕捉。  这件事发生了,谁也不知道,因为我给抓住了

   思考:异常发生之后,如果我选择上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。

  1.8注意:Java中异常发生之后,如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道了这个异常发生,只有一个结果,终止java程序的执行。

        

2.什么是UML?有什么用?

 UML是一种统一建模语言(画图的)UML不是只有java中使用。只要是面向对象的编程语言,都有UML。

一般画UML图的都是软件架构师或者说是系统分析师。这些级别的人员使用的。软件设计人员使用UML。

在UML图中可以描述类和类之间的关系,程序执行的流程,对象的状态等。

盖大楼和软件开发一样,一个道理:

 盖楼之前,会先由建筑师画图纸,图纸上一个一个符号都是标准符号。这个图纸画完,只要是搞建筑的都能看懂,因为这个图纸上标注的这些符号都是一种“标准的语言”。

在Java软件开发当中,软件分析师/设计师负责设计类,Java软件开发人员必须看得懂

处理异常的第一种方式:在方法声明的位置上使用throws关键字抛出,谁调用这个方法,我就抛给谁,抛给调用者来处理

这种处理的态度:上报

处理异常的第二种方式:

 使用try…catch语句对异常进行捕捉。这个异常不会上报,自已把这个是处理了。异常抛到此处为止,不再上抛了。

 注意:只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行,另外需要注意的是,try语句块中的某一行出现异常,该行后面的代码不会执行。Try…catch捕捉异常之后,后续代码可以执行。

 import java.io.FileInputStream;

 import java.io.FileNotFoundException;

 import java.io.IOException;

 public class ExceptionTest06{

   //一般不建议在main方法上使用throws,因为这个异常如果真正的发生了,一定会抛给JVM。JVM只有终止。

  //异常处理机制的作用是增强程序的健壮性。怎么能做到,异常发生了也不影响程序的执行。所以一般main方法中异常建议使用try…catch进行捕捉。main就不要继续上抛了。

  /*

    public static void main(String[] args) throws FileNotFoundException{

        System.out.println("main begin");

         m1();

       System.out.println("main over");

    }

  */

  

    public static void main(String[] args){

       System.out.println("main begin");

       try{

           //try尝试

           m1();

           //以上代码出现异常,直接进入catch语句块中执行

           System.out.println("hello world");

       }catch(FileNotFoundException e){  //catch后面的好像是一个方法的形参

          //catch是捕捉异常之后走的分支

         //这个分支中可以使用e引用,e引用保存的内存地址是那个new出来异常对象的内存地址

        //在catch中干什么?处理异常

          System.out.println("文件不存在,可能路径错误,也可能该文件被删除了!");

       }

       //try…catch把异常抓住之后,这里的代码会继续执行

       System.out.println("main over");

    }

 

    private static void m1() throws FileNotFoundException{

      System.out.println("m1 begin");

      m2();

      //以上代码出异常,这里是无法执行的

      System.out.println("m1 over");

   }

  

  //抛别的不行,抛ClassCastException说明你还是没有对FileNotFoundException进行处理

  //private static void m2() throws ClassCastException{

 

  //抛FileNotFoundException的父对象IOException,这样是可以的。因为IOException包括FileNotFoundException

  //private static void m2() throws IOException{

  //这样也可以,因为Exception包括所有的异常

 //private static void m2() throws Exception{

 //throws后面也可以写多个异常,可以使用逗号隔开

 //private static void m2() throws ClassCastException,FileNotFoundException{

   private static void m2() throws FileNotFoundException{

      System.out.println("m2 begin");

      m3();

      //以上如果出现异常,这里是无法执行的

      System.out.println("m2 over");

   }

    private static void m3() throws FileNotFoundException{

     //调用SUN jdk中某个类的构造方法

     //这个类还没有接触过,后期IO流的时候就知道了

    //只是借助这个类学习一下异常处理机制

   //创建一个输入流对象,该流指向一个文件

   /*

     编译报错的原因是什么?

       第一:这里调用了一个构造方法:FileInputStream(String name)

       第二:这个构造方法的声明位置上有:throws FileNotFoundException

       第三:通过类的继承结构看到:FileNotFoundException父类是IOException,IOException的父类是Exception

       最终得知,FileNotFoundException是编译时异常。

    错误原因:编译时异常要求程序员编写程序阶段必须对它进行处理,不处理编译器会报错。

   */

    //采用第一种处理方式:在方法声明的位置上使用throws继续上抛

    //一个方法体当中的代码出先异常之后,如果上报的话,此方法结束。

    new FileInputStream("D:\\course\\01-开课\\学习方法.txt");

    System.out.println("如果以上代码出异常,这里不会执行");

    }

}

异常对象有两个非常重要的方法:

   获取异常简单的描述信息:

      String msg = exception.getMessage();

   打印异常追踪的堆栈信息:

      exception.printStackTrace();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值