一、基础知识

处理异常,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. linux串口命令

    proc # cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 t ...

  2. string leetcode-6.ZigZag

    6. ZigZag Conversion 题面 The string "PAYPALISHIRING" is written in a zigzag pattern on a gi ...

  3. linux 基础8-shell script

    1. 什么是shell script 1.1 介绍: 什么是 shell script (程序化脚本) 呢?就字面上的意义,我们将他分为两部份. 在『 shell 』部分,我们在bash当中已经提过了 ...

  4. sql注入原理,利用与防护

    一.sql注入原理 注入攻击的本质就是把用户输入的数据当作代码来执行.所以注入攻击有两个必要条件 1.用户能够控制的输入. 2.原本程序要执行的代码,拼接了用户输入的数据. 二.sql注入分类 按照请 ...

  5. ubuntu安装supervisor

    1. Ubuntu14中supervisor的安装及配置 2. Ubuntu 14.04下进程管理工具supervisor安装 3. Supervisor使用教程 4. supervisor在deep ...

  6. .NET Core中使用水印

    .NET Core中使用水印 在项目中,我需要给上传的图片添加水印,通过网上查找针对.NET Core 的找到两个方案: 使用 CoreCompat.System.Drawing 及用于非Window ...

  7. idou老师教你学Istio 20 : Istio全景监控与拓扑

    根据Istio官方报告,Observe(可观察性)为其重要特性.Istio提供非侵入式的自动监控,记录应用内所有的服务. 我们知道在Istio的架构中,Mixer是管理和收集遥测信息的组件.每一次当请 ...

  8. 通过字节码分析Java异常处理机制

    在上一次[https://www.cnblogs.com/webor2006/p/9691523.html]初步对异常表相关的概念进行了了解,先来回顾一下: 其源代码也贴一下: 下面来看一下jclas ...

  9. Git学习笔记08-远程仓库

    因为想在家里和公司都能用到一套代码,所以选择上传到github,记录一下使用经验. 需要安装git,和注册github 以下操作是第一次将自己的代码上传到GitHub上 1)创建github项目 1. ...

  10. 如何在jupyter中安装R

    地址:(http://irkernel.github.io/installation/) 第一步:在R中安装必备包 install.packages(c('repr', 'IRdisplay', 'e ...