Java异常类型以及处理实例详解

目录
  • 一、异常的描述
  • 二、异常的体系
  • 三、异常的分类:
  • 四、异常处理的捕捉形式
  • 五、异常处理的原则
  • 六、finally
  • 七、异常的应用
  • 八、异常的注意事项:
  • 总结

一、异常的描述

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止。在Java中即,Java在编译或运行或者运行过程中出现的错误。

Java提供了更加优秀的解决办法:异常处理机制。

异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。

Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手动抛出的,只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。

  • 异常指在运行时期发生的不正常情况。
  • 在java中用类的形式对不正常情况进行了描述和封装对象。
  • 描述不正常情况的类,就成为异常类。
  • 将正常代码和问题处理代码分离,提高阅读性。
  • 其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述。

二、异常的体系

两大类:

  • hrowable:可抛出的异常,无论是error还是exception,问题发生就应该可以抛出,让调用者知道并且处理。
  • 该体系的特点就是在于Throwable及其所有的子类都具有可抛性。

可抛性到底指的是什么?怎么体现可抛性呢?

  • 通过两个关键字来体现的。
  • throws throw 凡是可以被这两个关键字所操作的类和对象都具有可抛性。
  • 子类1  一般不可处理的。————Error
  • 特点:是由jvm抛出的严重性问题,这种问题发生一般不针对性处理,直接修改程序。
  • 子类2)可以处理的。————Exception,问题抛给调用者,谁用抛给谁。
  • 特点:子类后缀名都是用其父类名作为后缀名,阅读性很强!

范例:比如自定义一个负数角标的异常,使用面向对象思想封装成对象。

  • 注意:如果让一个类称为异常类,必须要继承异常类。因为只有异常体系的子类才具有可抛性。
class FuShuIndex extends Exception{
                //构造函数 和类名一样
                FuShuIndex(){
                }
                //定义一个带参数的构造函数
                FuShuIndex(String msg){
                    //调用Exception中的带参数异常函数
                    super(msg);
                }
            }
            主函数 throws FuShuIndex:{
               int[] arr = new int[3];
               method(arr,-7);
            }
            public static int method(int[] arr,int index) throws arrIndexexception {
                 if (index<0){
                    throw new arrIndexexception("数组的角标不能为负数");
                 }
                return arr[index];
            }

三、异常的分类:

编译时被检测异常还要是Exception和其子类都是,除了特殊子类RuntimeException体系未处理即编译失败!

  • 这种问题一旦出现,希望在编译时就进行检测,让这种问题有相应的处理方式,这样的问题都可以针对性处理。

编译时不被检测异常(运行时异常):RuntimeException和其子类

  • 可处理可不处理,编译都可以通过,运行时会检测!
  • 这种问题的发生,无法让功能继续,运算无法运行,更多因为调用的原因导致,或者引发了内部状态的改变导致的。这种问题一般不处理,直接编译通过,在运行时,让调用者时程序强制停止,让调用者对代码进行修正。

throws和throw的区别:

  • throws使用在函数上  ————申明
  • throw使用在函数内,可以抛出多个,用逗号隔开。 ————抛出
  • throws抛出的是异常类,可以抛出多个。
  • throw抛出的是异常对象。

四、异常处理的捕捉形式

这是可以对异常进行针对性处理的方式。

格式:

try{
            //需要被检测异常的代码
        }
        catch(异常类 变量)//该变量用于接收发生的异常对象{
            //处理异常代码
        }
        finally{
            //一定会被执行的代码
      }

范例

class FuShuIndex extends Exception{
            //构造函数 和类名一样
            FuShuIndex(){
            }
            //定义一个带参数的构造函数
            FuShuIndex(String msg){
                //调用Exception中的带参数异常函数
                super(msg);
            }
  }

主函数:无需throws抛出,下面我们自己捕获异常

{
           int[] arr = new int[3];
           try{
           method(arr,-7);
           }catch(arrIndexexception a){
                a.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法。
                System.out.println("数组的角标异常!!!");//自定义捕获后打印的信息
                System.out.println(a.toString());//打印该异常对象的信息
                System.out.println(a.getMessage());//获取我们自定义抛出所定义的信息
                }
  }
public static int method(int[] arr,int index) throws arrIndexexception {
             if (index<0){
                throw new arrIndexexception("数组的角标不能为负数");
             }
            return arr[index];
 }

一个try对应多个catch:

  • 多catch情况下,父类的catch要放在最下面,否则编译为空。

五、异常处理的原则

函数内部如果抛出了需要检测的异常,那么函数上必须申明,或者必须在函数内用try catch捕捉,否则编译失败。

如果调用到了申明异常的函数,要么try catch 或者 throws ,否则编译失败。

什么时候catch?什么时候throws?

  • 功能内容可以解决,用catch。
  • 解决不了,用throws告诉调用者,由调用者解决。

一个功能如果抛出了多个异常,那么调用时,必须有对应的多个catch来进行针对性处理。

  • 内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个异常。

六、finally

通常用于关闭(释放)资源。必须要执行。除非jvm虚拟机挂了。

范例:出门玩,必须关门,所以将关门这个动作放在finally里面,必须执行。

凡是涉及到关闭连接等操作,要用finally代码块来释放资源。

try catch finally 代码块组合特点:

  • try catch finally:当有资源需要释放时,可以定义finally
  • try catch(多个):当没有资源需要释放时,可以不定义finally
  • try finally:异常处理不处理我不管,但是我得关闭资源,因为资源是我开的,得在内部关掉资源。

范例:

try{
                    //连接数据库
                }
                    //没有catch意思不处理异常,只单纯的捕获异常
                finally{
                    //关闭连接
                }

七、异常的应用

老师用电脑讲课范例:

电脑类:

public class Computer {
                private int state = 2;
                public void run() throws lanpingExcption,maoyanExcption{
                    if (state == 1){
                        throw new lanpingExcption("电脑蓝屏啦~");
                    }else if (state == 2){
                        throw new maoyanExcption("电脑冒烟啦~");
                    }
                    System.out.println("电脑启动");
                }
                public void chongqi(){
                    state = 0;
                    System.out.println("重启电脑!");
                }
  }

老师类:

public class Teacher {
            private String name;
            private Computer computer;
            Teacher(String name){
                this.name = name;
                computer = new Computer();
            }

            void teach() throws maoyanExcption{
                try {
                    computer.run();
                    System.out.println(this.name + "开始用电脑讲课了");
                } catch (lanpingExcption l) {
                    l.printStackTrace();
                    computer.chongqi();
                    teach();//重启后再次讲课
                } catch (maoyanExcption m) {
                    m.printStackTrace();
                    test();
                    throw m;
                }
            }

            public void test(){
                System.out.println("大家自己练习去~");
            }

  }

蓝屏异常类:

public class lanpingExcption extends Exception{
            lanpingExcption (String msg){
                 super(msg);
            }
 }

冒烟异常类:

public class maoyanExcption extends Exception {
            maoyanExcption (String msg){
                super(msg);
            }
}

主函数:

public class Testmain {
            public static void main (String[] args){
                Teacher teacher = new Teacher("丁老师");
                try {
                    teacher.teach();
                } catch (maoyanExcption m) {
                    //m.printStackTrace();
                    System.out.println("。。。。。");
                }
            }
    }

八、异常的注意事项:

  • 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
  • 如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
  • 子类覆盖父类,只能抛出父类的异常或者子类。
  • 如果父类的方法没有抛出异常,子类覆盖时绝对不能抛。

总结

到此这篇关于Java异常类型以及处理的文章就介绍到这了,更多相关Java异常类型及处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java中的connection reset 异常处理分析

    在Java中常看见的几个connection rest exception, Broken pipe, Connection reset,Connection reset by peer Socked reset case Linux中会有2个常见的sock reset 情况下的错误代码 ECONNRESET 该错误被描述为"connection reset by peer",即"对方复位连接",这种情况一般发生在服务进程较客户进程提前终止.当服务进程终止时会向客户

  • Java异常分类及统一处理详解

    一.异常分类 java异常分为"检查"和"非检查"两类,"检查"二字的意思是,代码编译时,编译器会去Check一下有没有进行异常处理(捕获或向上抛),对于归类为需要检查的异常,若没处理,编译就过不去.        初学的时候,常常想为啥异常要这样分类处理? 后来明白了些,异常不过两种:主观和客观,一个大多数情况下可以避免,一个大多数情况下无法避免.        像NullPointerException这类异常,大多跟程序员素质挂钩(开发好,

  • Java HttpURLConnection超时和IO异常处理

    最近同步数据的时候发现了一个问题,我本身后台插入数据后给其他部门后台做同步.说简单一点其实就是调用对方提供的接口,进行HTTP请求调用.然后后面发现问题了.HTTP请求的话,有可能请求超时,中断失败,IO异常其实都有可能,如果是平时打开一个网页还好,打不开的时候,你会关掉,或者他页面给你显示信息.但是同步,不可以这样做,一旦请求失败,必须让数据正确的同步,今天才意识到这个问题的重要性. String httpUrl = "https://www.baidu.com/s?ie=UTF-8&

  • 深入探讨JAVA中的异常与错误处理

    异常与错误: 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它.Java中使用异常类来表示异常,不同的异常类代表了不同的异常.但是在Java中所有的异常都有一个基类,叫做Exception. 错误: 它指的是一个合理的应用程序不能截获的严重的问题.大多数都是反常的情况.错误是VM的一个故障(虽然它可以是任何系统级的服务).

  • Java中异常处理之try和catch代码块的使用

    Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常.这样做有两个好处.第一,它允许你修正错误.第二,它防止程序自动终止.大多数用户对于在程序终止运行和在无论何时错误发生都会打印堆栈轨迹感到很烦恼(至少可以这么说).幸运的是,这很容易避免. 为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了.紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句.完成这个任务很简单,下面的程序包含一个

  • java异常与错误处理基本知识

    异常与错误:异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它.Java中使用异常类来表示异常,不同的异常类代表了不同的异常.但是在Java中所有的异常都有一个基类,叫做Exception.错误:它指的是一个合理的应用程序不能截获的严重的问题.大多数都是反常的情况.错误是VM的一个故障(虽然它可以是任何系统级的服务).所以,

  • java进行error捕获和处理示例(java异常捕获)

    下面给个小例子,来验证一下error的捕获. 复制代码 代码如下: public class TestCatchError extends Error{ private static final long serialVersionUID = -351488225420878020L; public TestCatchError(){        super();    } public TestCatchError(String msg){        super(msg);    } p

  • java异常处理机制示例(java抛出异常、捕获、断言)

    这是一个介绍基本异常处理的小例子,包括抛出,捕获,断言,日志. Java异常处理通过5个关键字try.catch.throw.throws.finally进行管理.基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出.你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象. 复制代码 代码如下: package

  • Java程序常见异常及处理汇总

    一.JDK中常见的异常情况 1.常见异常总结图 2.java中异常分类 Throwable类有两个直接子类: (1)Exception:出现的问题是可以被捕获的 (2)Error:系统错误,通常由JVM处理 3.被捕获的异常分类 (1)Check异常: 派生自Exception的异常类,必须被捕获或再次声明抛出 (2)Runtime异常:派生自RuntimeException的异常类.使用throw语句可以随时抛出这种异常对象 throw new ArithmeticException(-);

  • 详解Java异常处理中throw与throws关键字的用法区别

    抛出异常 抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常.下面它们之间的异同. 系统自动抛异常 当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出异常.如: public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b); //function(); } 系统会自动抛出ArithmeticException异常: Exception in threa

随机推荐