我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【JAVA 异常处理机制】

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【JAVA 异常处理机制】


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


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

  • java中所有错误的超类为:Throwable。其下有两个子类:Error和Exception
  • Error的子类描述的都是系统错误,比如虚拟机内存溢出等
  • Exception的子类描述的都是程序错误,比如空指针,下表越界等
  • 通常我们程序中处理的异常都是Exception
    在这里插入图片描述
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("程序结束了...");    }}

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();            }        }    }}

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();        }    }}

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());    }}

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!!

当一个子类重写超类含有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 {//    }}
  • **可检测异常:**可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,编译器就通不过,不允许编译

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

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

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

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

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

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

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

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("程序结束了");    }}

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

  • 异常的类名要做到见名知义
  • 需要是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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【JAVA 异常处理机制】

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

下载Word文档

猜你喜欢

【JAVA 异常处理机制】

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

Java的异常处理机制

本篇内容介绍了“Java的异常处理机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 异常处理异常是程序中的一些错误,但并不是所有的
2023-06-02

教妹学 Java :异常处理机制

异常是指中断程序正常执行的一个不确定的事件。当异常发生时,程序的正常执行流程就会被打断。一般情况下,程序都会有很多条语句,如果没有异常处理机制,前面的语句一旦出现了异常,后面的语句就没办法继续执行了。”

在 Java 中,异常处理机制究竟是什么?(java中异常处理机制是什么)

在Java编程中,异常处理机制是一个至关重要的概念,它允许开发者在程序运行过程中捕获和处理异常情况,以提高程序的稳定性和可靠性。一、异常的概念异常是在程序运行过程中发生的错误或异常情况,这些情况可能是由于用户输入错误、文件读
在 Java 中,异常处理机制究竟是什么?(java中异常处理机制是什么)
Java2024-12-17

java异常处理机制原理是什么

Java异常处理机制的原理是基于异常(Exception)的概念。在Java中,异常是指在程序运行过程中发生的错误或异常情况。当代码出现异常时,可以使用异常处理机制来捕获和处理异常,以保证程序的正常运行。Java的异常处理机制基于三个关键词
2023-09-16

Java异常处理机制有什么用

这篇文章主要介绍了Java异常处理机制有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.异常概述与异常体系结构1.1异常概述异常:在Java语言中,将程序执行中发生的
2023-06-25

Java异常处理机制实例分析

这篇文章主要介绍“Java异常处理机制实例分析”,在日常操作中,相信很多人在Java异常处理机制实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java异常处理机制实例分析”的疑惑有所帮助!接下来,请跟
2023-06-29

如何实现 Java WebMagic 的异常处理与重试机制?(Java WebMagic异常处理与重试机制)

在JavaWebMagic的开发过程中,异常处理和重试机制是非常重要的组成部分。它们能够帮助我们处理各种可能出现的错误情况,提高程序的稳定性和可靠性。本文将详细介绍JavaWebMagic异常处理与重试机制的实现方法。一、异常处理
如何实现 Java WebMagic 的异常处理与重试机制?(Java WebMagic异常处理与重试机制)
Java2024-12-20

怎样解析Java的异常处理机制

这期内容当中小编将会给大家带来有关怎样解析Java的异常处理机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代
2023-06-17

Java异常处理机制的示例分析

这篇文章给大家分享的是有关Java异常处理机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.初识异常我们在写代码的时候都或多或少碰到了大大小小的异常,例如:public class Test {
2023-06-26

java中异常处理机制的原理是什么

Java中的异常处理机制是基于异常类的继承关系和异常处理代码块的机制。当程序发生异常时,会抛出一个异常对象,该异常对象会沿着调用链向上抛出,直到被捕获并处理或者直到程序终止。Java中的异常类都是从java.lang.Throwable类派
2023-08-31

Java中的异常处理机制介绍(非常全面!)

异常可能是在程序执行过程中产生的,也可能是程序中throw主动抛出的,下面这篇文章主要给大家介绍了关于Java中异常处理机制的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录