首页 > 编程语言 >8.Java异常

8.Java异常

时间:2024-08-31 18:36:44浏览次数:4  
标签:Exception Java System println catch 异常 out

什么是异常

  • 实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了,等等。
  • 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理。而不至于程序崩溃。
  • 异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
  • 异常发生在程序运行期间,它影响了正常的程序执行流程。

代码:

public class Demo {

    public static void main(String[] args) {
        new Demo01().a(); 
        //Exception in thread "main" java.lang.StackOverflowError
        System.out.println(11/0); 
        //Exception in thread "main" java.lang.ArithmeticException
    }

    public void a() {
        b();
    }

    public void b() {
        a();
    }
}

异常分类

要理解java异常处理是如何工作的,你需要掌握以下三种类型的异常:

  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误ERROR:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

异常体系结构

  • Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

  • 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。

java异常体系结构

Error

  • Error类对象由Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
  • Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
  • 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。

Exception

  • 在Exception分支中有一个重要的子类RuntimeException(运行时异常)

    • ArrayIndexOutOfBoundsException(数组下标越界)
    • NullPointerException(空指针异常)
    • ArithmeticException(算术异常)
    • MissingResourceException(丢失资源)
    • ClassNotFoundException(找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
  • 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

Error和Exception的区别

Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。

异常处理机制

  • 抛出异常
  • 捕获异常
  • 关键字:try、catch、finally、throw、throws

代码:

public class Test {
    public static void main(String[] args) {

        int a = 1;
        int b = 0;

        //假设要捕获多个异常:从小到大
        //生成try catch快捷键:Ctrl+Alt+T
        try { //try监控区域
            System.out.println(a / b);
        } catch (ArithmeticException e) { //catch(想要捕获的异常类型) 捕获异常
            System.out.println("程序出现异常,变量b不能为0");
//            e.printStackTrace(); //打印错误的栈信息
        } catch (Exception e) {
            System.out.println("Exception");
        } catch (Error e) {
            System.out.println("Error");
        } catch (Throwable e) {
            System.out.println("Throwable");
        } finally { //finally 处理善后工作(例如关闭io流,资源),finally可以没有
            //finally代码块:不管有没有抛出异常都会执行
            System.out.println("finally");
        }

        
        //方法中主动抛出异常
        try {
            new Test().test(a,b);
        } catch (ArithmeticException e) {
            System.out.println("程序出现异常,变量b不能为0");
        } finally {
            System.out.println("finally");
        }


    }

    //假设这个方法中,处理不了这个异常,则向上抛出异常 throws
    public void test(int a, int b) throws ArithmeticException {
        if (b == 0) {
            throw new ArithmeticException(); //主动抛出异常,一般在方法中使用 throw
        }
        System.out.println(a / b);
    }
}

自定义异常

  • 使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
  • 在程序中使用自定义异常类,大体可分为以下几个步骤:
    1. 创建自定义异常类。
    2. 在方法中通过throw关键字抛出异常对象。
    3. 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
    4. 在出现异常方法的调用者中捕获并处理异常。

代码:

//自定义的异常类
public class MyException extends Exception {
    
    //传递数字大于10
    private int detail;

    public MyException(int detail) {
        this.detail = detail;
    }

    //toString:异常的打印信息
    @Override
    public String toString() {
        return "MyException{" + detail + "}";
    }
}
public class Test {

    //可能会存在异常的方法
    static void test(int a) throws MyException {
        System.out.println("传递的参数为:" + a);
        if (a > 10) {
            throw new MyException(a); //抛出异常
        }
        System.out.println("OK");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyException e) {
            System.out.println("MyException=>" + e);
        }
    }
}

实际应用中的总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理。
  • 在多重catch块后面,可以加一个catch (Exception)来处理可能会被遗漏的异常。
  • 对于不确定的代码,也可以加上try-catch,处理潜在的异常。
  • 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出。
  • 具体如何处理异常,要根据不同的业务需求和异常类型去决定。
  • 尽量添加finally语句块去释放占用的资源, IO流 Scanner。

标签:Exception,Java,System,println,catch,异常,out
From: https://www.cnblogs.com/spicy-hot-pot/p/18390586

相关文章

  • 贵州省专业技术人员继续教育刷课脚本-JavaScript编写
    脚本学习网站:gzjxjy.gzsrs.cn、ghlearning.com、gzzj.ghlearning.com、...脚本地址:贵州省专业技术人员继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击......
  • 陕西省专业技术人员继续教育刷课脚本-JavaScript编写
    脚本学习网站:陕西省专业技术人员继续教育学习平台:jxjy01.xidian.edu.cn脚本地址:陕西省专业技术人员继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击......
  • Java利用POI实现对Word的操作(包括有换行的文本和图片)
    目录一、实现效果二、实现部分1、导入依赖2、工具类3、实体类4、测试代码如果您也有类似的需求,可以参考这篇文章进行实现并扩展。一、实现效果1、重要说明:①普通文本使用${字段名}进行标注,有换行的文本使用$${字段名}进行标注。②图片使用#{字段名}进行标注......
  • Java设计模式之单例模式(Singleton)
    单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。这样的模式有几个好处:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。省去了new操作符,降低了系统内存的使用频率,减轻GC压力。有些类如交易所的核心交易引擎......
  • JAVA基础之三-接口和抽象类
    java提供了抽象类和接口,总体是好事。有的OOP语言并没有接口的概念,但相当一部分其实用其它方式实现了JAVA中接口类似的功能。如果不太清楚二者的区别,难免在面临具体业务的时候,在二者之间摇摆。---实际上,关于抽象类和接口的共同点和不同点没有什么可以写的。设计原则原则让我们......
  • 入门篇-其之七-Java运算符
    入门篇-其之七-Java运算符(下)合集-iCode504的Java学习空间(13)1.入门篇-其之一-第一个Java程序2023-07-232.入门篇-其之二-Java基础知识2023-09-043.入门篇-其之三-基本数据类型及其转换2023-09-064.入门篇-其之四-字符串String的简单使用2023-09-255.入门篇-其之......
  • 【华为OD机试真题E卷】31、最大社交距离 | 机试真题+思路参考+代码分析(E卷复用)(C语言、
    文章目录一、题目......
  • (免费源码)计算机毕业设计必看必学 SSM大学生实习就业推荐系统68986 原创定制程序 java
    SSM大学生实习就业推荐系统 摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于角度存在偏差,人们经常能够获取不同类型的信息,这也是技术最为难以攻克的课题。针对大学生实习就业推荐系统等问题,对大学生实习就业推荐系统进行研究......
  • A-计算机毕业设计定制:10508民大校园美食推荐系统的设计与实现(免费领源码)可做计算机毕
    摘要 随着数字化时代的到来,校园美食推荐系统的设计与实现具有重要意义。针对民大校园中商家、普通用户和管理员之间的信息交互和服务需求,开发这样一个系统能够有效促进校园内美食资源的共享和利用,提供美食介绍和美食推荐的渠道,提高校园内美食行业的服务水平,增强校园内外用户......
  • A-计算机毕业设计定制:18099居家养老服务系统(免费领源码)可做计算机毕业设计JAVA、PHP
    摘  要1绪论1.1研究背景1.2研究意义1.3主要研究内容1.4论文章节安排2 相关技术介绍2.1Node.JS编程语言2.2MySQL数据库3 系统分析3.1可行性分析3.1.1技术可行性分析3.1.2经济可行性分析3.1.3操作可行性分析3.2系统流程分析3.2.1 ......