一、基础知识

处理异常,java提供了一个优秀的解决方案:异常处理机制。

java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception。

java异常体系结构图如下:

Error类:这类异常由java虚拟机生成并抛出,大多数错误与代码编写者无关,不能被程序员通过代码来处理。发生这种异常时,java虚拟机一般会选择关闭线程。Error异常很少出现,所以我们更应该关注Exception分支下异常。

Exception类:这类异常通常可以被程序处理,也是我们需要关注的重点。

根据javac对异常处理的要求,我们可以将异常分为两类:

非受查异常:java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常。javac在编译时,不会提示和发现这类异常,不要求在程序中处理这些异常。这样的异常多半是代码写的有问题,比如除零、数组越界、空指针异常等。

受查异常:除了Error类或RuntimeException类的所有异常。javac在编译时,会检查这类异常,要么通过try-catch语句进行捕获,要么通过throws语句进行抛出,否则编译不通过。

需要明确的是受查和非受查是对于javac而言的,非受查异常为编译器不要求强制处理的异常,受查异常则是编译器必须处理的异常。

二、异常处理机制

异常处理机制的本质是抛出异常捕获异常。

2.1、抛出异常

有些异常,我们不知道该如何处理或者说交给调用者处理更好。我们就需要将这种类型的异常抛出,交给上一级去处理,或者可以继续抛出,交给更高一级的调用者去处理。

抛出异常有两个关键字:throwthrows

throws:抛出方法中可能导致的异常,这个异常并不一定发生。这有利于调用者及时处理这些可能发生的异常,保护自己的程序。方法中抛出的所有受查异常,必须通过throws子句抛出,否则会导致编译错误。

语法:

public void method throws EOFException,FileNotFoundException,...{
//method body
}

【示例】

public class AppTest extends TestCase {

    @Test
public void test() {
try {
checkedTest();
} catch (FileNotFoundException e) {
System.out.println("未找到文件!");
}
} public void checkedTest() throws FileNotFoundException {
FileInputStream fileIn = new FileInputStream("E:\\a.txt");
System.out.println("FileInputStream抛出受查异常");
}
}

throw:抛出明确的异常,throw后面的任何语句不会被执行,

语法:

throw new Exception();

【示例】

public class AppTest extends TestCase {

    @Test
public void test() {
throwTest(null);
} public void throwTest(String input) {
if (input == null) {
throw new NullPointerException();
}
}
}

2.2、捕获异常

语法:

try{
//可能出现异常的代码
}catch(SQLException e){ }catch(Exception e){ }finally{ }

这里有几点需要注意:

1)如果代码可能抛出多种异常,相应的我们也要使用多个catch子句进行捕获。当异常发生时,每个catch子句会被依次检查,当第一个匹配的子句被执行时,捕获结束,其他的子句将不会再检查。所以这里有一个重要原则:先子类后父类

2)finally子句是可选项,可有可无。无论出不出现异常,finally都会在try/catch之后执行。

  • 不要再finally里使用return,会覆盖前面的返回值。
  • 不要在finally里抛出异常,会抑制前面抛出的异常。
  • 尽量不要再finally里做其他事,finally仅仅用于释放资源最合适。
  • 尽量将所有的return写在方法的最后,不要写在try/catch/finally中。

三、异常分析

【示例】

public class Java8Tester {
public static void main(String args[]) {
throwTest(null);
} public static void throwTest(String input) {
if (input == null) {
throw new NullPointerException();
}
}
}

结果:

Exception in thread "main" java.lang.NullPointerException//异常线程,异常类型
at com.my.Java8Tester.throwTest(Java8Tester.java:16)//异常抛出点
at com.my.Java8Tester.main(Java8Tester.java:11)//调用方法

JAVA基础知识|异常的更多相关文章

  1. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  4. Java 基础知识(一)

    Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...

  5. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  6. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  7. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  8. 【考试】java基础知识测试,看你能得多少分?

    1 前言 共有5道java基础知识的单项选择题,每道20分,共计100分.解析和答案在最后. 2 试题 2.1 如下程序运行结果是什么? class Parent { public Parent(St ...

  9. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

随机推荐

  1. Nginx Too many open files

    2019/07/25 08:31:31 [crit] 15929#15929: accept4() failed (24: Too many open files) 2019/07/25 08:31: ...

  2. JS原型的动态性

    由于在原型中查找成员的过程是一次搜索,所以我们对原型对象所做的任何修改都能立即从实例上反映出来(但不包括对原型对象的重写,下面会介绍到),即使是对原型的修改操作在创建实例之后.如下面的示例所示: fu ...

  3. VBA比较运算符

    VBA支持的比较运算符如下所示. 假设变量A=10,变量B=20,则 - 运算符 描述 示例 = 检查两个操作数的值是否相等.如果是,那么条件是真. (A = B)结果为:False <> ...

  4. python3爬虫之requests库基本使用

    官方文档链接(中文) https://2.python-requests.org/zh_CN/latest/ requests  基于  urllib3 ,python编写. 安装 pip insta ...

  5. Linux的关机和重启命令

    Linux有如下的关机和重启命令:shutdown, reboot, halt, poweroff,那么它们有什么区别呢? shutdown - 建议使用的命令 shutdown是最常用也是最安全的关 ...

  6. python matplotlib动态绘图

    matplotlib animation的官方文档: http://matplotlib.org/api/animation_api.html 接下来完成一个实时获取cpu数值,并绘图的功能. 1.动 ...

  7. Mac下安装和配置Vue项目

    题记:学vue有一段时间了,终于今天下定决心每日书写一篇学习笔记.1.访问node.js官网:https://nodejs.org/en/ 下载对应安装包.2.安装完成,在终端输入 : node -v ...

  8. mongodb聚合查询-aggregate

    Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...

  9. tiny4412 串口驱动分析九 --- shell终端

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  10. python网络爬虫第三弹(<爬取get请求的页面数据>)

    一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是通过代码模拟浏览器发送请求,其常被用到的子模块在 python3中的为urllib.request 和 urllib ...