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

  

异常的分类

  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. oc工程中oc、swift混编代码打包成静态framework踩坑笔记

    参考资料: https://www.jianshu.com/p/734341f7c242 https://www.jianshu.com/p/55038871e7de   两天时间探索,期间不知道遇到 ...

  2. css4——浮动

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. python读写配置文件使用总结与避坑指南

    关于今天的内容 最近拿python在写项目部署的相关集成代码,本来两天的工作量,硬是在来回的需求变更中,拖到了一周的时间.今天算是暂时告一段落了.这次由于涉及多个系统的调用和配置参数,代码开发中出现了 ...

  4. Quantitative proteomics of Uukuniemi virus-host cell interactions reveals GBF1 as proviral host factor for phleboviruses(乌库涅米病毒-宿主细胞互作的定量蛋白质组学揭示了GBF1是个白蛉病毒的前病毒宿主因子)-解读人:谭亦凡

    期刊名:Molecular & Cellular Proteomics 发表时间:(2019年12月) IF:4.828 单位:1德国海德堡大学附属医院2德国汉诺威医科大学3德国亥姆霍茲感染研 ...

  5. JVM前奏篇(大局观)

    话不多说直接上干货,先来看oracle官网中是怎么描述JDK的:https://docs.oracle.com/javase/8/docs/index.html 这是官网中JDK.JRE.JVM的一个 ...

  6. Nginx专题(2):Nginx的负载均衡策略及其配置

    本文介绍了Nginx的负载均衡策略,一致性hash分配原理,及常用的故障节点的摘除与恢复配置. 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第一期-宜信支付结算八方数据团队高级技术经理 ...

  7. 使用Carthage集成Alamofire

    Carthage相较于Cocoapods有着使用灵活,对目标工程改动小的优势,使得它越来越受欢迎.今天就对我使用Carthage集成FBSDK做一个记录. 1.首先https://github.com ...

  8. ARTS-S centos查看端口被哪个进程占用

    netstat -tunlp | grep 80 或者 lsof -i:80

  9. Kinect-v2 Examples with MS-SDK(译文二)

    K2-asset提供的脚本组件 K2-asset在KinectScripts文件夹中提供通用脚本组件,并在KinectDemos / 文件夹的相应脚本子文件夹中提供特定于演示的组件.可以在自己的Uni ...

  10. 新版FPC摄像头测评 OV7725 OV7670 OV9650 OV9655 OV5640 OV5642 OV2640 OV3640 MT9D112

    新版FPC摄像头测评 OV7725 OV7670 OV9650 OV9655 OV5640 OV5642 OV2640 OV3640 MT9D112 最新制样新版FPC摄像头板卡,先看看结构尺寸 再瞧 ...