如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时,这个方法会立刻退出同时不返回任何值。另外,调用这个方法的其他代码也无法继续执行,异常处理机制会将代码执行交给异常处理器。

  

异常的分类

  Throwable是Java语言中所有错误或异常的超类。下一层分为Error和Exception。

  Throwable的常用方法:

    String getMessage()  返回此throwable的详细消息字符串;

    void printStackTrace()  将此throwable及其追踪输出至标准错误流;

    String toString()  返回此throwable的简短描述;

Error

  Error类是指Java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止,它是由Java虚拟机抛出的。

Exception(RuntimeException、CheckedException)

  Exception又有两个分支,一个是运行时异常RuntimeException,一个是检查时异常CheckedException。

  RuntimeException如:NullPointerException、ClassCastException;一个是检查异常CheckedException,如IO错误导致的IOException、SQLException。RuntimeException是那些可能在Java虚拟机正常运行期间抛出的异常的超类。如果出现RuntimeException,那么一定是程序员的错误。

  检查异常CheckedException:一般是外部错误,这种异常都发生在编译阶段,Java编译器会强制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行try...catch,该类异常一般包括几个方面:

    1)试图在文件尾部读取数据;

    2)试图打开一个错误格式的URL;

    3)试图根据给定的字符串查找class对象,而这个字符串表示的类并不存在;

异常的处理方式

抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。

1)对代码块用try...catch进行异常捕获处理

单个异常的处理

    try {
这里写可能出错的代码
} catch (Exception e) {
这里写可能出现的错误异常的处理
}finally{
这里写一定会执行的代码,有些资源需要关闭的时候
}

多个异常的处理

 try{
可能出现问题的代码
}catch(异常类名1 对象名1){
//异常处理
}catch(异常类名2 对象名2(){
//异常处理
}
Jdk7以后出现另一种方式处理多个异常:
try {
String strDate = "2018-6-20" ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
//解析
Date d = sdf.parse(strDate) ;
System.out.println(d);
}catch(ParseException e) { //创建一个异常对象:PareException e = new ParseException() ;
//使用throwable里面的一些方法
String str = e.getMessage() ;
System.out.println(str);//Unparseable date: "2018-6-20"
String str = e.toString() ;//简单描述
System.out.println(str);//包名.类名: getMessage() ;
e.printStackTrace();
}
finally{
//里面的代码一定会被执行,除非jvm退出了
}
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
int div(int a,int b) throws Exception{
return a/b;
}

2)在该代码的方法体外用throws(表示可能出现的异常)进行抛出声明,告知此方法的调用者这段代码可能会出现这些异常,你需要谨慎处理。此时有两种情况:

  如果声明抛出的异常是非运行时异常,此方法的调用者必须显式地用try...catch块进行捕获或者继续向上层抛出异常。

  如果声明抛出的异常是运行时异常,此方法的调用者可以选择地进行异常捕获处理。

 throws也是表示抛出异常,它后面跟的异常类名,并且可以多个异常类名中间用逗号隔开;

   xxx  返回值  方法名()throws 异常类名{}

  例如:

    public void show() throws IOException,ClassNotFoundException{...}

3)在代码块用throw手动抛出一个异常对象,此时也有两种情况:

  如果抛出的异常对象是非运行时异常,此方法的调用者必须显式地用try...catch块进行捕获或者继续向上层抛出异常(使用throws)。

  如果抛出的异常对象是运行时异常,此方法的调用者可以选择地进行异常捕获处理。(如果最终将异常抛给main方法,则相当于交给JVM自动处理,此时JVM会简单地打印异常信息)。

## throw和throws的区别

位置不同

  1)throws用在函数上,后面跟的是异常类,可以跟多个;而throw用在函数内,后面跟的是具体的异常对象。

功能不同

  2)throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw抛出具体的问题对象,执行到throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。

  3)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

  4)两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常上传,谁调用我我就抛给谁。

    用在方法声明后面,跟的是异常类名;

    可以跟多个异常类名,用逗号隔开;

    表示抛出异常,由该方法的调用者来处理;

    throws表示出现异常的一种可能性,并不一定会发生这些异常;

 package com.xinkaipu.Exception;
class Math{
public int div(int i,int j) throws Exception{ int t=i/j; return t; }
}
public class ThrowsDemo {
public static void main(String args[]) throws Exception{ Math m=new Math(); }
}

throw:用来抛出一个具体的异常类型

    用在方法体内,跟的是异常对象名;

    只能抛出一个异常对象名;

    表示抛出异常,由方法体内的语句处理;

    throw则是抛出了异常,执行throw则一定抛出了某种异常;

 package com.xinkaipu.Exception;
public class TestThrow
{
public static void main(String[] args)
{
try
{
//调用带throws声明的方法,必须显式捕获该异常。否则,必须在main方法中再次声明抛出
throwChecked(-3);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
//调用抛出Runtime异常的方法既可以显式捕获该异常,也可不理会该异常
throwRuntime(3);
}
public static void throwChecked(int a)throws Exception
{
if (a > 0)
{
//自行抛出Exception异常。该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a)
{
if (a > 0)
{
//自行抛出RuntimeException异常,既可以显式捕获该异常。也可完全不理会该异常,把该异常交给该方法调用者处理
throw new RuntimeException("a的值大于0,不符合要求");
}
}
}

try...catch...finally 语句执行顺序

  1)finally语句总会执行。不管前面try..catch语句中是否有return,是否有异常,finally都会执行!

  2)如果try...catch中有return语句,finally中没有return,那么在finally中修改除包装类型和静态变量、全局变量以外的数据都不会对try...catch中返回的变量有任何影响

  3)尽量不要在finally中使用return语句,如果使用的话,会忽略try、catch中的返回语句,也会忽略try、catch中的异常,屏蔽了错误的发生

  4)finally中避免再次抛出异常,一旦finally中发生异常,代码执行将会抛出finally中的异常信息,try、catch中的异常将被忽略

  5)finally不能单独使用

异常中的注意事项

  1)运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。如果没有异常抛出,执行完try块,也要去执行finally块的代码,然后执行finally块后面的语句。

  2)throw是语句抛出一个异常;throws是方法抛出一个异常;

  3)throws可以单独使用,但throw不能,throw要么和try...catch...finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

  4)如果finally有return语句,永远返回finally中的结果,避免该情况。

Java异常及异常处理的更多相关文章

  1. 第11章 Java异常与异常处理

    1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...

  2. java异常,异常处理,异常类 关键字:throws 和 throw 自定义的异常类

    package cn.kecheng; import java.util.Scanner; /**异常:异常是指在程序的运行过程中所发生的不正常的情况,它会中断正在运行的程序 异常处理机制:java中 ...

  3. Java异常与异常处理简单使用

    异常就是程序运行过程中阻止当前方法或作用域继续执行的问题: 任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示.保 ...

  4. 那些年,我们不懂的却又不得不提的 JAVA异常和异常处理!

    ---恢复内容开始--- 首先,我是个小小的菜鸟,最近突然突发奇想,想研究一下java的异常和异常的处理,稍有些理解,老鸟们莫要嘲笑... 既然要讲异常和异常的处理,我们就要先了解异常,那么,什么是异 ...

  5. JAVA异常与异常处理详解

    一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...

  6. JAVA异常及其异常处理方式

    异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Syste ...

  7. Java异常与异常处理

    异常体系结构 1.所有异常都继承于Throwable类,其下有两大子类: (1)Error类:错误,一般编程人员不太接触,如虚拟机错误.线程死锁.硬伤:使程序崩溃 (2)Exception类:异常,编 ...

  8. JAVA异常与异常处理详解【转】

    感谢!!!原文地址:https://www.cnblogs.com/knightsu/p/7114914.html 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在ja ...

  9. JAVA 异常和异常处理

    目录 一.异常 1.基本概念 2.异常体系图 3.五大运行时异常 4.编译异常 二.异常处理 1.异常处理的方式 1.1try-catch异常处理 注意事项 课堂练习题 1.2throws异常处理 注 ...

随机推荐

  1. 华为云 AI 实战营计划,带你迈上 AI 之路

    当今,AI的开发人才需求呈现极大的供需不平衡.所有开发者都关心,要如何从一名开发者晋升为AI开发者?AI开发能力,是主要的进入障碍.不用慌,华为云推出了 <华为云ModelArts-Lab AI ...

  2. 给一线讲产品·8期|VPC、子网、安全组,是什么关系?

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  3. OA思维导图(第一次画)

  4. CF 17E Palisection 求相交回文串个数

    In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...

  5. POJ 3660 cow contest (Folyed 求传递闭包)

    N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...

  6. WebGPU学习(五): 现代图形API技术要点和WebGPU支持情况调研

    大家好,本文整理了现代图形API的技术要点,重点研究了并行和GPU Driven Render Pipeline相关的知识点,调查了WebGPU的相关支持情况. 另外,本文对实时光线追踪也进行了简要的 ...

  7. intellij idea使用tomcat maven plugin

    环境 java 1.8.0_111 tomcat tomcat-8.5.11 maven 3.2.5 intellij idea 14.0.3 命令行使用 建maven工程 mvn archetype ...

  8. usb2.0高速视频采集之68013A寄存器配置说明

    任何的固件编程离不开与与原理图参考,图纸中所采用的是USB的Slave_fifo传输方式,具体配置与图纸对应即可. •USB_IFCLK:同步Slave_FIFO模式,输入频率范围5M-48M,在FP ...

  9. Linux环境(服务器)下非root用户安装Python3.6

    Linux环境(服务器)下非root用户安装Python3.6 在管理实验室集群时候,遇到的问题--非root用户在搭建自己环境时候,如何搭建. 注意: root用户的根目录是root,非root用户 ...

  10. python学习-for

    # 对字典的遍历. key-value# dict_my = {"class":"python17","goal":"翻倍&quo ...