Java实践(二)---异常小结

来源:互联网 发布:游戏设计软件 编辑:程序博客网 时间:2024/05/16 19:08

1、异常定义

在Java程序运行时,会出现一些非正常的现象,这种情况称为运行错误。根据性质可以分为错误和异常。

Java程序中,所以throw的异常必须从Throwable中派生而来

这里写图片描述

1-1、Error
Error类对象由Java虚拟机生成并抛出的对象(通常Java程序不对这里异常进行处理)。例如:程序进入死循环、内存泄漏(存在一些被分配的对象有一下2种情况:1、对象可达;2、对象无用)等。【未检查异常】

1-2、Exception
Exception类对象是由Java程序处理或抛出的对象,它有各种不同的子类,对应于不同类型的异常。分为2类Runtime Exception和IOException

  • Runtime Exception:运行时有JVM生成的异常,原因是编程错误【未检查异常】
  • IOException:程序本身没有问题,但由于像I/O错误这类问题导致的异常【检查异常】

【Java编译器要求程序必须捕获或者声明所以的非运行时异常(即 IOException),但是对于运行时异常可以不做处理】

常见的异常有:

  1. 代码或调用的代码中有错误
  2. 操作系统资源不可用
  3. 公共语言运行库遇到意外情况
  4. 数组下标越界
  5. 算法溢出(超出数值表达范围)
  6. 除数为0
  7. 无效参数
  8. 内存溢出

2、异常关键字

Java异常处理的关键字有5个:

  • throw
  • throws
  • try
  • catch
  • throw
  • finally

2-1、try,catch,finally语句块
不能单独使用,可以组合使用如:

        try {        } catch (Exception e) {            e.printStackTrace();        }        try {        } finally {        }        try {        } catch (Exception e) {            e.printStackTrace();        } finally {        }

try,catch,finally语句块中变量的作用域为代码块内部,分别独立而不能相互访问【如果需要在三个代码块汇总都可以访问,需要将变量定义到这些代码块的外面】

catch语句可以有一个或多个,finally语句最多一个。如果有多个catch语句,只会匹配其中一个异常类型并执行catch语句块。匹配catch语句块的顺序为自上而下。

2-2、 throw 和throws

  1. throw关键字用于方法体内,用来抛出一个Throwable类型的异常
  2. throws关键字用于方法体外的方法声明部分,用来声明方法可能会抛出某些异常

如果throw抛出检查异常,那么应该在头部声明方法可能抛出的异常类型,方法调用者必须检查处理抛出的异常。当调用者无法处理时,继续上抛,而不是在catch中处理

如果如果throw抛出未检查异常(Error或者RuntimeException),则方法调用者可以选择处理该异常

如果所有方法层层上抛获取的异常,最终JVM会进行处理(即把异常消息和堆栈信息打印出来)

3、异常处理中常见问题

3-1、过于庞大的try语句块

异常对象从产生点产生后,到被捕捉后终止的全过程中,实际上是一个值传递的过程,应该更具实际类合理控制检测异常个数。

catch语句表示会出现的某种异常,而且希望能够处理该异常,所以catch语句中应该尽量指定具体异常类型,一般一个catch处理一种异常。

3-2、异常的完整性

在Java语言中,如果一个函数运行时可能会向上层调用者抛出一个异常,那么,就必须在该函数显式声明(throws)

在Java的异常处理中利用throw抛出一个异常,必须由catch捕获并处理这个异常

如果函数内部可能抛出一种类型的异常,但该函数内部不想用catch处理,那么不需使用throws显式的声明可能抛出的这种异常

原创粉丝点击