广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【JAVA 异常处理机制】
  • 510
分享到

【JAVA 异常处理机制】

java开发语言学习intellijidea 2023-08-23 08:08:01 510人浏览 泡泡鱼
摘要

文章目录 前言1.java异常处理机制2.try-catch3.finally块4.自动关闭特性5.throw关键字6.throws关键字7.throws的重写规则8.异常分类9.异常API10.自定义异常总结: 前言 在Ja


前言

在Java编程中,异常处理是一种重要的机制,用于处理程序运行时可能出现的错误和异常情况。异常处理机制可以帮助开发者优雅地处理异常,提高程序的健壮性和可靠性。


提示:以下是本篇文章正文内容,下面案例可供参考

1.java异常处理机制

  • java中所有错误的超类为:Throwable。其下有两个子类:Error和Exception
  • Error的子类描述的都是系统错误,比如虚拟机内存溢出等
  • Exception的子类描述的都是程序错误,比如空指针,下表越界等
  • 通常我们程序中处理的异常都是Exception
    在这里插入图片描述

2.try-catch

package exception;public class TryCatchDemo {    public static void main(String[] args) {        System.out.println("程序开始了...");                try {//            String str = null;//            String str = "";            String str = "a";                    System.out.println(str.length());//抛出空指针异常            System.out.println(str.charAt(0));            System.out.println(Integer.parseInt(str));                        System.out.println("!!!!!!!!!!!!!!");//        }catch(NullPointerException e){//            //这里实际开发中是写补救措施的,通常也会将异常信息输出便于debug//            System.out.println("出现了空指针,并解决了!");//        }catch(StringIndexOutOfBoundsException e){//            System.out.println("处理字符串下标越界问题!");//        }                }catch(NullPointerException|StringIndexOutOfBoundsException e){            System.out.println("处理空指针或下标越界!");                }catch(Exception e){            System.out.println("反正就是出了个错!");        }        System.out.println("程序结束了...");    }}

3.finally块

finally块是异常处理机制中的最后一块

  • finally可以直接跟在try语句块之后
  • finally可以跟在最后一个catch块之后
  • fianlly下面不能再定义catch块
    特点:
    只要程序执行到异常处理机制中(执行到try语句块中),无论try中的代码是否出现异常,finally最终都必定执行
    作用:
    通常用来执行释放资源这一类操作。例如IO操作完毕后的流关闭。
package exception;public class FinallyDemo {    public static void main(String[] args) {        System.out.println("程序开始了");        try {            String str = "null";            System.out.println(str.length());            return;//结束方法,结束前finally还是要执行的        } catch (Exception e) {            System.out.println("出错了");        }finally {            System.out.println("finally中的代码执行了");        }        System.out.println("程序结束了");    }}

在IO中的应用

package exception;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class FinallyDemo2 {    public static void main(String[] args) {        FileOutputStream fos = null;        try {            fos = new FileOutputStream("./fos.dat");            fos.write(1);        } catch (IOException e) {            System.out.println("出错了");        } finally {            try {                if(fos!=null) {                    fos.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

4.自动关闭特性

jdk7之后java推出了一个新特性:自动关闭特性可以更优雅的在异常处理机制中关闭IO
语法

try(   声明并初始化IO对象){   IO操作}catch(IOException e){//catch各种IO异常   ...}

package exception;import java.io.FileOutputStream;import java.io.IOException;public class AutoCloseableDemo {    public static void main(String[] args) {        //自动关闭特性是编译器认可的,编译后就变成FinallyDemo2的样子        try(                FileOutputStream fos = new FileOutputStream("fos.dat");        ){            fos.write(1);        } catch (IOException e) {            e.printStackTrace();        }    }}

5.throw关键字

throw用来对外主动抛出一个异常,通常下面两种情况我们主动对外抛出异常:

  • 当程序遇到一个满足语法,但是不满足业务要求时,可以抛出一个异常告知调用者
  • 程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时可以抛出给调用者
package exception;public class Person {    private int age;    public int getAge() {        return age;    }    public void setAge(int age) throws Exception {        if(age<0||age>100){            //使用throw对外抛出一个异常            throw new RuntimeException("年龄不合法!");        }        this.age = age;    }}
package exception;public class ThrowDemo {    public static void main(String[] args) {        Person p = new Person();        p.setAge(10000);//符合语法,但是不符合业务逻辑要求。        System.out.println("此人年龄:"+p.getAge());    }}

6.throws关键字

throws用来在声明方法时同时声明该方法可能抛出的异常,用于通知调用方添加处理该异常的手段。
当一个方法中使用throw抛出一个非RuntimeException的异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译不通过。

package exception;public class Person {    private int age;    public int getAge() {        return age;    }        public void setAge(int age) throws Exception {        if(age<0||age>100){            //使用throw对外抛出一个异常//            throw new RuntimeException("年龄不合法!");            //除了RuntimeException之外,抛出什么异常就要在方法上声明throws什么异常            throw new Exception("年龄不合法!");        }        this.age = age;    }}

当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。 处理手段有两种:

  • 使用try-catch捕获并处理这个异常
  • 在当前方法(本案例就是main方法)上继续使用throws声明该异常的抛出给调用者解决。 具体选取那种取决于异常处理的责任问题。
package exception;public class ThrowDemo {    public static void main(String[] args){        System.out.println("程序开始了...");        try {            Person p = new Person();                        p.setAge(100000);//典型的符合语法,但是不符合业务逻辑要求            System.out.println("此人年龄:"+p.getAge()+"岁");        } catch (Exception e) {            e.printStackTrace();        }        System.out.println("程序结束了...");    }}

注意,永远不应当在main方法上使用throws!!

7.throws的重写规则

当一个子类重写超类含有throws声明异常抛出的方法时,针对throws的重写规则

  • 允许不再抛出任何异常
  • 允许仅抛出部分异常
  • 允许抛出超类方法声明抛出异常的子类型异常
  • 不允许抛出额外异常(超类方法没有声明的且不存在继承关系的)
  • 不允许抛出超类方法抛出异常的超类型异常

    子类方法的几种重写分别解开注释就可以观察编译器是否允许该种重写方式
package exception;import java.awt.*;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.SQLException;public class ThrowsDemo {    public void dosome()throws IOException, AWTException {    }}class SubClass extends ThrowsDemo{//    public void dosome()throws IOException, AWTException {//    }    //允许不再抛出任何异常//    public void dosome(){//    }    //允许仅抛出部分异常//    public void dosome()throws IOException{//    }    //允许抛出超类方法声明抛出异常的子类型异常//    public void dosome()throws FileNotFoundException {//    }    //不允许抛出额外异常(超类方法没有声明的且不存在继承关系的)//    public void dosome()throws SQLException {//    }    //不允许抛出超类方法抛出异常的超类型异常//    public void dosome()throws Exception {//    }}

8.异常分类

  • **可检测异常:**可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,编译器就通不过,不允许编译

  • **非检测异常:**非检测异常不遵循处理或者声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常

  • RuntimeException 类属于非检测异常,因为普通JVM操作引起的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在java应用程序中会频繁出现。因此它们不受编译器检查与处理或声明规则的限制。实际上RuntimeException及其子类型表达的都是因为程序漏洞(BUG),即:逻辑不严谨等原因导致的。这类异常都是通过修复代码可完全避免的异常,因此不应当由异常处理机制来处理
    常见的RuntimeException子类

  • IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数

  • NullPointerException:当应用程序试图在需要对象的地方使用 null 时,抛出该异常

  • ArrayIndexOutOfBoundsException:当使用的数组下标超出数组允许范围时,抛出该异常

  • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常

  • NumberFORMatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常

9.异常api

Exception上有一些常用的方法

  • void printStackTrace():用于输出当前异常的堆栈跟踪信息便于程序员找到错误根源,分析错误原因制定B计划
  • String getMessage():用于获取当前错误消息多用于提示给用户或记录日志使用

package exception;public class ExceptionAPIDemo {    public static void main(String[] args) {        System.out.println("程序开始了");        try {            String str = "abc";            System.out.println(Integer.parseInt(str));        } catch (NumberFormatException e) {            //输出错误堆栈跟踪信息便于程序员找到错误根源,分析错误原因制定B计划            e.printStackTrace();//输出错误信息            //错误消息多用于提示给用户或记录日志使用            String message = e.getMessage();//获取错误消息            System.out.println(message);        }        System.out.println("程序结束了");    }}

10.自定义异常

自定义异常通常用来定义那些业务上的异常问题
定义自定义异常需要注意以下问题:

  • 异常的类名要做到见名知义
  • 需要是Exception的子类
  • 提供超类异常提供的所有种类构造器

package exception;public class IllegalAgeException extends Exception{    public IllegalAgeException() {    }    public IllegalAgeException(String message) {        super(message);    }    public IllegalAgeException(String message, Throwable cause) {        super(message, cause);    }    public IllegalAgeException(Throwable cause) {        super(cause);    }    public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {        super(message, cause, enableSuppression, writableStackTrace);    }}
package exception;public class Person {    private int age;    public int getAge() {        return age;    }        public void setAge(int age) throws IllegalAgeException {        if(age<0||age>100){            //使用throw对外抛出一个异常//            throw new RuntimeException("年龄不合法!");            //除了RuntimeException之外,抛出什么异常就要在方法上声明throws什么异常//            throw new Exception("年龄不合法!");            //抛出自定义异常            throw new IllegalAgeException("年龄超范围:"+age);        }        this.age = age;    }}
package exception;public class ThrowDemo {    public static void main(String[] args){        System.out.println("程序开始了...");        try {            Person p = new Person();                        p.setAge(100000);//典型的符合语法,但是不符合业务逻辑要求            System.out.println("此人年龄:"+p.getAge()+"岁");        } catch (IllegalAgeException e) {            e.printStackTrace();        }        System.out.println("程序结束了...");    }}

总结:

java异常处理机制:

  • 异常处理机制是用来处理那些可能存在的异常,但是无法通过修改逻辑完全规避的场景。
  • 而如果通过修改逻辑可以规避的异常是bug,不应当用异常处理机制在运行期间解决!应当在编码时及时修正

try语句块用来包含可能出错的代码片段.

catch用来捕获并处理对应的异常,可以定义多个,也可以合并多个异常在一个catch中.

finally是异常的最后一块,只要程序执行到try中则必走。一般用于释放资源这类操作.

throw用于主动对外抛出异常。要么是满足语法不满足业务主动抛出异常,要么就是实际发生了异常但是不应当在当前代码片段被解决时抛出。具体情况要结合实际业务分析.

throws用于在方法声明时声明该异常的抛出,使得调用者必须处理该异常.

来源地址:https://blog.csdn.net/weixin_72847531/article/details/131949698

--结束END--

本文标题: 【JAVA 异常处理机制】

本文链接: https://www.lsjlt.com/news/378444.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【JAVA 异常处理机制】
    文章目录 前言1.java异常处理机制2.try-catch3.finally块4.自动关闭特性5.throw关键字6.throws关键字7.throws的重写规则8.异常分类9.异常API10.自定义异常总结: 前言 在Ja...
    99+
    2023-08-23
    java 开发语言 学习 intellij idea
  • Java异常的处理机制
    图片解析: 1.生成字节码文件的过程可能产生编译时异常(checked),由字节码文件到在内存中加载、运行类此过程可能产生运行时异常(unchecked), 2.JAVA程序在执行...
    99+
    2022-11-12
  • Java的异常处理机制
    本篇内容介绍了“Java的异常处理机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 异常处理异常是程序中的一些错误,但并不是所有的...
    99+
    2023-06-02
  • Java异常处理机制深入理解
    目录1.初识异常2.异常的基本用法异常处理流程3.为什么要使用异常?异常应只用于异常的情况4. 异常的种类 4.1 受查异常解决方案:4.2非受查异常5.如何使用异常避免不...
    99+
    2022-11-13
  • Java SpringMVC异常处理机制详解
    目录异常处理的思路测试环境准备异常处理两种方式方式一:简单异常处理器方式二:自定义异常处理器总结异常处理的思路 测试环境准备 首先写一个DemoController控制层的类作为测...
    99+
    2022-11-12
  • Java 详解异常的处理机制
    目录1.异常概述与异常体系结构1.1异常概述1.2运行时异常与编译时异常1.3异常体系结构2.常见异常1.ArrayIndexOutOfBoundsException2.NullPo...
    99+
    2022-11-12
  • java异常处理机制原理是什么
    Java异常处理机制的原理是基于异常(Exception)的概念。在Java中,异常是指在程序运行过程中发生的错误或异常情况。当代码...
    99+
    2023-09-16
    java
  • Java超详细梳理异常处理机制
    目录一、异常概述与异常体系结构1. 异常概述引入概念2. 分类2.1 Error vs Exception2.2 编译时异常vs运行时异常3. 常见异常3.1 分类3.2 代码演示二...
    99+
    2022-11-13
  • Java异常处理机制有什么用
    这篇文章主要介绍了Java异常处理机制有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.异常概述与异常体系结构1.1异常概述异常:在Java语言中,将程序执行中发生的...
    99+
    2023-06-25
  • Java异常处理机制实例分析
    这篇文章主要介绍“Java异常处理机制实例分析”,在日常操作中,相信很多人在Java异常处理机制实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java异常处理机制实例分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • 怎样解析Java的异常处理机制
    这期内容当中小编将会给大家带来有关怎样解析Java的异常处理机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。你觉得自己是一个Java专家吗是否肯定自己已经全面掌握了Java的异常处理机制在下面这段代码中...
    99+
    2023-06-17
  • Java try-catch-finally异常处理机制详解
    Java中的try-catch-finally异常处理 一、异常处理 异常(Exception):是在运行发生的不正常情况。 原始异常处理: if(条件) {   处理办法1  ...
    99+
    2022-11-12
  • Java线程的异常处理机制详情
    目录前言线程的异常处理机制小结线程池场景下的异常处理小结其他前言 启动一个Java程序,本质上是运行某个Java类的main方法。我们写一个死循环程序,跑起来,然后运行jvisual...
    99+
    2022-11-13
  • Java十分钟精通异常处理机制
    目录一、什么是异常二、异常的结构图三、捕获异常四、声明和抛出异常1.使用throws声明异常2.使用throw抛出异常案例:1、嵌套try-catch2、代替返回语句五、自定义异常一...
    99+
    2022-11-13
  • Java异常处理机制的示例分析
    这篇文章给大家分享的是有关Java异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.初识异常我们在写代码的时候都或多或少碰到了大大小小的异常,例如:public class&nbs...
    99+
    2023-06-26
  • java中异常处理机制的原理是什么
    Java中的异常处理机制是基于异常类的继承关系和异常处理代码块的机制。当程序发生异常时,会抛出一个异常对象,该异常对象会沿着调用链向...
    99+
    2023-08-31
    java
  • Java中的异常处理机制介绍(非常全面!)
    目录异常处理机制编译时异常处理机制异常处理方式一异常处理方式二异常处理方式三运行时异常处理机制总结异常处理机制 异常的默认处理流程如下: 默认会在出现异常的代码那里自动的创建一个异常...
    99+
    2023-01-18
    Java异常处理机制原理 java中包含异常处理机制 java异常处理方式两种
  • 最全最详细的Java异常处理机制
    一、异常概述与异常体系结构 异常概述         在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网...
    99+
    2023-09-10
    java 开发语言 后端
  • Java中异常处理机制的示例分析
    这篇文章给大家分享的是有关Java中异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能...
    99+
    2023-06-03
  • Java 中的异常处理机制详情介绍
    目录介绍 Java 中的异常介绍 Error介绍 ExceptionJava 异常类的结构如何处理函数抛出的异常吞掉 or 抛出受检异常 or 非受检异常处理异常的原则尽量不要捕获通...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作