一、基础知识

处理异常,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. ES6语法 学习

    ECMAScript 6,也被称为ECMAScript 2015是ECMAScript标准的最新版本.6是语言的一个重要更新,并第一次更新语言由于ES5 2009标准.现在主要JavaScript引擎 ...

  2. 【web】Chrome 浏览器中查看 webSocket 连接信息

    1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang=& ...

  3. win7电脑数字键盘失灵怎么办

    转自:https://zhidao.baidu.com/question/370674322729785324.html 解决方法: 第一步.同时按下“Windows键” + “R”调出运行窗口. 第 ...

  4. Mysql高可用集群-解决MMM单点故障

    目录 一.理论概述 组件介绍 三.部署 四.测试 五.总结 preface: MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧. 一.理论概述 MMM(Master-Maste ...

  5. C和指针--预处理器

    编译一个C程序的第1个步骤是预处理(preprocessing)阶段.C预处理器在源代码编译之前对其进行一些文本性质的操作.它的主要任务包括删除注释.插入被#include指令包含的文件的内容.定义和 ...

  6. Linux学习笔记(八)Linux常用命令:用户登录查看命令

    一.查看登录用户信息 w [用户名] 二.Who who 三.查询当前登录和过去登陆的用户信息 last 四.查看所有用户最后一次登录时间 lastlog

  7. keepalived+lvs+usp安装实施文档

    操作系统平台:RedHat6.4  x86_64 软件:LVS+keepalived LVS+Keepalived 介绍 LVS LVS是Linux Virtual Server的简写,意即Linux ...

  8. jade-for-each-while

    if else还是for循环,在jade里面都是可执行的代码 for循环 - var lession = {course:'jade', level:'high'} - for (var k in l ...

  9. SQL SERVER 2008 存储过程传表参数

      最近项目使用到了存储过程传入表类型参数. --定义表类型 create type t_table_type as table ( id int, name varchar(32), sex var ...

  10. Python+request 登录接口reponse的返回值token跨py文件的传递《二》

    主要使用场景: 一般我们在进行接口测试时,依赖登录接口后reponse中的某些返回值,因此需要将login接口单独写一个py文件,另外的py文件均可调用login的reponse返回值使用.共用登录接 ...