好程序员Java教程系列之异常定义

好程序员Java教程分享Java系列之异常定义

异常定义

异常:就是程序在运行的过程中遇到的种种不正常的情况。

特点:如果一个程序在运行中遇到了一个未经处理的异常,则这个异常会终止程序的运行。

? 但是如果程序出现的异常被处理了,此时程序不会被终止。所以我们需要知道怎么去处理异常。

其实在Java中,异常也是一个类。

类的体系:

  • Throwable: 是所有的异常的根类

    • Error: 发生在编译器级别的,我们程序无法处理的错误。
    • Exception: 我们可以去处理的异常。
    • RuntimeException:

异常的分类:可以分成两种异常:

  • 运行时异常(Runtime Exception)

    • 发生在程序运行的过程中的异常。
    • 如果不处理这种异常,程序可以正常编译,但是当执行到异常产生的时候,会终止程序的运行。
    • 例如:NullPointerException、IndexOutOfBoundsException、ArithmeticException...
  • 非运行时异常(Non-Runtime Exception)
    • 发生在程序编译的过程中的异常。(编译时异常)
    • 如果不处理这种异常,程序将无法进行编译。
    • 例如:ParseException...

常用结构

需要使用语法:try-catch-finally

语法:

try {

? // 这里写可能会产生异常的代码。

? // 注意:

? // 一旦这里面的代码产生了异常,从异常产生开始往后所有try中的代码都不再执行,直接执行指定的catch

}

catch(需要捕获的异常类型 标识符) {

? // 捕获异常,如果try中产生的异常类型和我们要捕获的异常类型匹配,此时会执行这个代码段中的内容

? // 如果执行到这里了,相当于这个异常被捕获、处理了,这个异常将不再终止程序的运行。

}

finally {

? // 这里的代码始终会执行。

? // 无论try中的代码有没有异常产生,这里的代码都会执行。

? // 在这里我们一般情况下是做一些资源释放的工作。

}

备注:

  1. 以上,是完整的try-catch-finally语句。但是实际在用的时候,try后面可以只有catch, 也可只有finally,但是不能什么都没有。
  2. 一般情况下,catch我们是不会省略不写的。
  3. 如果try中的代码可能产生的异常不止一种
    1. 如果需要对产生的不同异常进行不同的处理,可以使用多个catch语句

      1. 多个catch语句的先后顺序

        1. 如果多个catch中的异常,没有继承关系,则先后顺序没有影响
        2. 如果多个catch中的异常,有继承关系,则子类异常在前,父类异常在后
    2. 如果需要对某些异常做同样的处理,可以在同一个catch中,用 | 拼接所有要处理的异常。
      1. 这些用|拼接起来的异常之间,不能有继承关系
    3. 如果需要对所有的异常做同样的处理,可以在一个catch中捕获一个父类异常。
public static int show(int a, int b) {
  int c = 0;
  try {
      c = a / b;
      // 能走到这里,说明上面的除没有异常。
      return c;
  }
  catch (ArithmeticException e) {
      System.out.println("出现了一个算术异常");
      return c;
  }
  finally {
      // 在return之前,执行finally中的代码段
      System.out.println("finally中的代码执行了");
      c = -10;
  }
}

以上代码段,在try和catch中都有return语句。

finally中的代码始终会执行,但是针对这种情况,他的执行时机:

先执行return语句,此时,将需要返回的值缓存起来。然后再去执行finally语句中的代码,执行结束后,返回刚才缓存的那个值。

finally关键字的应用

throw和throws关键字

throw:

常用在某一个方法中,表示抛出一个异常对象。等在调用这个方法的时候去处理这个异常。

一个异常对象被实例化完成后,不具备任何意义。只有被throw关键字抛出了,才具备异常的功能。

throws:
  1. 常用在方法的声明部分,用来描述这个方法可能会抛出什么异常,给调用这个方法的部分看的。

    • 如果在方法中使用throw抛出了一个Runtime Exception:

      • throws可以写,也可以不写
      • 备注:一般情况下,我们还是会按照实际情况进行描述的。
    • 如果在方法中使用throw抛出了一个Non-Runtime Exception:
      • 此时throws必须写
  2. 可以在方法中不去处理异常,将异常处理提到调用这个方法的时候。

注意:在方法重写中

  1. 如果重写的方法抛出的是一个Non-Runtime Exception

    1. 子类方法抛出的异常需要父类方法抛出异常的子类型,或者等同于父类方法抛出的异常类型
    2. 不能让子类重写的方法抛出异常的类型高于父类方法抛出的异常类型

自定义异常

系统给我们提供了很多的异常类,但是这些异常类并不能够满足我们所有的需求。这种情况下,我们就需要去自定义异常。继承自异常类,写一个子类即可。

  1. 自定义RuntimeException

    1. 继承自RuntimeException类,写一个子类。这个子类异常就是一个运行时异常。

      class NumberOfLegException extends RuntimeException {
        /**
         * 通过一个异常描述信息来实例化一个异常对象
         * @param message
         */
        public NumberOfLegException(String message) {
            // 怎么样去设置这个异常信息?
            super(message);
        }
      }
  2. 自定义Non-Runtime Exception
    1. 继承自Exception类,写一个子类。这个子类异常就是一个非运行时异常。

      class NumberOfLegException extends Exception {
        /**
         * 通过一个异常描述信息来实例化一个异常对象
         * @param message
         */
        public NumberOfLegException(String message) {
            // 怎么样去设置这个异常信息?
            super(message);
        }
      }

在自定义异常类的时候,类名最好使用Exception作为结尾

原文地址:https://blog.51cto.com/14573321/2458036

时间: 2025-01-07 20:42:24

好程序员Java教程系列之异常定义的相关文章

好程序员Java教程解读什么是swing

好程序员Java教程解读什么是swing,swing是java GUI应用程序,也就是java做的桌面应用.运行swing程序要求用户电脑上有java环境,这一点不太现实也不方便.现在的java主要以web方向为主,做移动应用和网站开发,分布式.多线程.高并发等都是java程序员发展的方向. 虽然企业开发中用到的不多,事实上在我十几年的开发生涯中没有用到过,我的朋友也没有做swing的.但也不能说学习它就没有用. 比如swing中的控件,如表格.树.面板.菜单等控件,各种事件如键盘.鼠标事件.结

好程序员Java教程分享MyBatis Plus介绍

好程序员Java教程分享MyBatis Plus介绍:1.MyBatis Plus 介绍 MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. MyBatis Plus 的核心功能有:支持通用的 CRUD.代码生成器与条件构造器. 通用 CRUD:定义好 Mapper 接口后,只需要继承 BaseMapper<T> 接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件 条件构造器:通过 Enti

好程序员Java教程Java动态代理机制详解

好程序员Java教程Java动态代理机制详解:在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: 1InvocationHandler is the interface implemented by the invocation handle

好程序员Java教程分享Javamain常见面试问题

好程序员Java教程分享Javamain常见面试问题,Java程序员在参加面试的时候,在Javamain方面都会被问到哪些问题呢?为大家准备一些常见的Javamain的基础知识问题,帮助大家在面试前做好准备: 1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java7之前,你可以通过使用静态初始化运行Java类.但是,从Java7开始就行不通了. 2.main()方法需要的参数不是字符串数组? 不是的,main()方法的参数必须是字符串数组. 但是,在引进

好程序员Java教程分享Java之设计模式

好程序员Java实用教程之设计模式,首先来讲一下单例设计模式 单例设计模式 /* * 设计模式:前人总结出来的对一些常见问题的解决方案,后人直接拿来使用. * 常用的设计模式:单例,工厂,代理,适配器,装饰,模板,观察者等,一共有23种 * 单例:一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用. * * 分析: * 1.我们肯定要建立一个单例类来描述 * 2.只允许有一个对象 * 3.全局的访问点:说的就是当前的s----通过static实现的 * 4.提供出去 * 5.给大家

黑马程序员——JAVA学习笔记五(异常)

1,     异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象.描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性. 其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述. 不同的问题用不同的类进行具体的描述.比如角标越界.空指针异常等等. 问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系. 不正常情况分成了两大类: Throwabl

好程序员Java教程解读JDBC是什么

JDBC简介-?JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序 -?Java 具有坚固.安全.易于使用.易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言.所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法. -?JD

好程序员Java教程分享Java中String类型的10个问题

如何比较两个字符串?用"="还是equals简单来说,"=="是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你想检测俩字符串是不是相等的,你就必须得用equals()方法. 如果你知道"字符串保留(string intern)"的概念那就更好了. 为什么安全敏感的字符串信息用char[]会比String对象更好?String对象是不可变的就意味着直到垃圾回收器过来清扫之前它们都不会发生变化

黑马程序员——java基础——异常

黑马程序员--java基础--异常 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常 就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信息存在.当出现多属性信息最方便的方式就是将这些信息进行封装.异常就是java按照面向对象的思想将问题进行对象封装. 异常体系 --------java.lang.Thro