Java之异常

news2024/11/16 18:09:42

Java之异常

异常

在这里插入图片描述

抛出异常

  • 所有标准异常类都有两个构造器:一个是默认构造器,另一个是接收字符串作为参数的构造器。
  • 使用throw关键字来抛出异常对象。
  • 可以抛出任何类型的Throwable对象,它是异常类型的根类。但是通常来说,我们对于不同异常还是抛出对应的异常比较好,可以方便其他人处理。
  •  if (true) {
         throw new Throwable();
     }
    
     if (true) {
         throw new Exception("hello");
     }
    
     if (true) {
         throw new NullPointerException("空指针异常");
     }
    
  • 异常说明:
    • 定义:它属于方法声明的一部分,跟在形式参数列表之后。
    • 作用:在明确会发送异常时,要么对异常进行处理,要么就使用异常说明,告知他人此方法将抛出异常,调用时需进行处理,他也可以选择处理还是继续向上抛出,如果最后被某个人处理了,那么就没问题,否则,程序会报出此异常。
    • 用法:使用throws关键字加上所有潜在异常类型的列表。
    • 可以只写一个异常类型来抛出所有可能的异常,就是Exception。
      •  public void test() throws NullPointerException, IndexOutOfBoundsException {
        
         }
        

捕获异常

try块

  • 作用:可以用来在方法内设置一个特殊的块去捕获异常。
  • 用法:在try关键字后面跟一个代码块,将可能发生异常的代码放入其中。
  •  try {
         //这里编写可能发生异常的代码
     }
    

异常处理

  • 当try块抓到了异常,我们就必须得想办法处理,此时就该异常处理程序上场了。
  • 异常处理程序是跟在try块后面的catch子句。
  • catch子句:
    • 用法:在catch关键字后面跟一个括号,再跟一个代码块,括号中是异常的对象及类型,代码块是编写怎么处理异常。
    • catch子句可以有多个,多个子句分别用来处理try块中代码可能抛出的所有种类的异常。
    • 当异常被抛出时,异常处理机制将查找参数与异常匹配的第一个处理程序,然后进入catch子句中执行。
    • 可以使用Exception对象的printStackTrace()方法打印从方法调用到异常抛出的堆栈。
    • 可以只写一个异常处理程序来捕获所有类型的异常,就是Exception,但是,最好把它放在最后,以防止前面有更具体的类型与异常相匹配。
    • 捕获了异常时,也可以不处理,使用throw继续向外抛出。同时,你可以使用fillInStackTrace()方法将异常的发生地更新。
      •  catch (Exception e) {
         	throw e.fillInStackTrace();
         }
        
    • 注:只有抛出的异常和catch声明的异常相匹配才会进入执行。
    •  catch (Exception e) {
           //这里编写处理异常的代码
       }
      

使用finall清理

  • 它是try是否会抓到异常都会执行的块。
  • 它通常与用于关闭资源等。
  • 使用:使用finally加一个代码块。
  • 它要么跟在try块后,要么跟在最后一个catch子句后。
    •  try {
           
       } catch (Exception e) {
           
       } finally {
           
       }
       
       try {
           
       } finally {
           
       }
      
  • finally子句永远会得到执行。
    •  try {
           System.out.println("try 1");
           if (true) {
               return;
           }
           System.out.println("try 2");
       } catch (Exception e) {
      
       } finally {
           System.out.println("finally 1");
       }
       
       输出:
       try 1
       finally 1
      

创建自定义异常

  • 可以从已有的异常类进行继承,尽量选择意思相近的异常类,如果找不到就使用Exception。
  • 所有异常的基类是Exception,Exception又是继承自Throwable类。
  • Throwable:
    • 可以调用以下方法打印堆栈信息。
    •  try {
           throw new Throwable("MyException");
       } catch (Throwable e) {
           System.out.println("getMessage():" + e.getMessage());
           System.out.println("getLocalizedMessage():" + e.getLocalizedMessage());
           System.out.println("toString():" + e);
           System.out.println("printStackTrace():");
           e.printStackTrace(System.out);
       }
       
       输出:
       getMessage()MyException
       getLocalizedMessage()MyException
       toString()java.lang.Throwable: MyException
       printStackTrace()java.lang.Throwable: MyException
       	at com.eos.javalearn.JavaLearnClass.main(JavaLearnClass.java:886)
      
    • 还可以使用getStackTrace()方法获取一个由栈轨迹中的元素所组成的数组,栈顶元素时异常抛出之处,栈底是第一个方法调用。获取之后可以打印每个元素的方法名、行号、所在文件的名字等等。
      •  try {
         	throw new Throwable("MyException");
         } catch (Throwable e) {
         	for (StackTraceElement ele : e.getStackTrace()) {
             	System.out.println(ele.getMethodName());
             	System.out.println(ele.getFileName());
             	System.out.println(ele.getLineNumber());
             	System.out.println("-------------------------------");
         	}
         }
        
  •  class MyException extends Exception {
    
     	public MyException() {
     	}
    
     	public MyException(String message) {
         	super(message);
     	}
     }
     
     public class JavaLearnClass {
    
     	public void test() throws MyException {
         	System.out.println("test()");
         	throw new MyException();
     	}
    
     	public void test1() throws MyException {
         	System.out.println("test1()");
         	throw new MyException("自定义异常");
     	}
    
     	public static void main(String[] args) {
    
         	JavaLearnClass javaLearnClass = new JavaLearnClass();
         	try {
             	javaLearnClass.test();
         	} catch (MyException e) {
             	System.out.println("捕获住了MyException异常!");
             	e.printStackTrace();
         	}
         	try {
             	javaLearnClass.test1();
         	} catch (MyException e) {
             	System.out.println("捕获住了MyException异常!");
             	e.printStackTrace();
         	}
         }
     }
     
     输出:
     test()
     捕获住了MyException异常!
     test1()
     捕获住了MyException异常!
      
     com.eos.javalearn.MyException
     	at com.eos.javalearn.JavaLearnClass.test(JavaLearnClass.java:857)
     	at com.eos.javalearn.JavaLearnClass.main(JavaLearnClass.java:869)
     com.eos.javalearn.MyException: 自定义异常
     	at com.eos.javalearn.JavaLearnClass.test1(JavaLearnClass.java:862)
     	at com.eos.javalearn.JavaLearnClass.main(JavaLearnClass.java:875)
    

异常丢失

  • ①在finally中使用return,导致异常丢失;
    • 如下:finally里进行了return,如果没有这个return,throw抛出的异常将会被打印出来,但是加了return之后则不会打印。
    •  try {
           System.out.println("try 1");
           if (true) {
               throw new RuntimeException();
           }
           System.out.println("try 2");
       } finally {
           System.out.println("finally 1");
           return;
       }
       
       输出:
       try 1
       finally 1
      
  • ②异常被抑制:
    • 如下:在finally中抛出了另一个异常,如果不抛出该异常时,try中的异常会正常打印,但是加上了之后则只会打印新的异常,try的异常将丢失。
    •  try {
           System.out.println("try 1");
           if (true) {
               throw new RuntimeException();
           }
           System.out.println("try 2");
       } finally {
           System.out.println("finally 1");
           throw new NullPointerException();
       }
       
       输出:
       try 1
       finally 1
       java.lang.NullPointerException
       	at com.eos.javalearn.JavaLearnClass.main(JavaLearnClass.java:906)
      
  • ③只捕获异常但不处理:
    • 如下:你进行了异常捕获,但是catch中没有任何处理或者打印异常的堆栈,导致异常发生时看不到任何信息。等于说是你把这个异常给私吞了,在你或他人遇到遇到问题时,只能看见异常现象,但是想通过log查看异常信息时却没有任何打印,这是要极力避免的。
      •  try {
         	throw new RuntimeException();
         } catch (Exception e) {
         
         }
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IC设计】数字IC设计读书笔记

文章目录 《专用集成电路设计实用教程》集成电路系统的组成集成电路的设计流程综合转化逻辑优化映射同步电路和异步电路亚稳态单时钟同步设计的时序约束目标库和初始环境设置DC如何计算每个逻辑单元的延迟(Cell Delay)?target librarylink li…

举个栗子~Tableau 技巧(255):文本表中高亮最新日期的数据

对于需要每天查看业务数据的分析用户来说,在刷新工作簿的数据之后,如果能高亮显示当天的数据(如下图),就可以事半功倍了! 那么,在 Tableau 中该如何高亮文本表最新的数据呢?今天的栗…

什么是HMI和SCADA?两者有什么区别

前言 几十年来,工业控制系统在工业自动化中发挥了重要作用,它允许过程制造商从生产车间采集、分析、处理数据。 在当今瞬息万变的工业环境中,制造商和公用事业公司必须采用现代HMI/SCADA和数字化转型,以跟上变化的步伐&#xff0…

阿里云云主机:ECS/轻量/虚拟主机/GPU/云电脑详解

阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等,阿里云百科来详细说下阿里云云主机详解: 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…

Java之面向对象

Java之面向对象 一切皆对象。 编译型语言:编译器会将我们编写的源码一次性地编译成计算机可识别的二进制文件,然后计算机直接执行。如c、c等。 解释型语言:在程序运行时,解释器会一行行读取我们的代码,然后实时地将这…

重学图结构

图 图的描述 G (V, E),一个偶对V:顶点(数据元素)组成的有穷非空集合{E}:边的有穷集合、图的逻辑结构:多对多 相关术语 无向图:每条边都是无方向的,如下图1 有向图:…

信息技术专业标准体系框架设计研究与思考

为了支撑企业数字化转型智能化发展工作,近期对信息技术专业标准体系进行了简单的梳理,借助ChatGPT进行分类设计分析,并对国际、行业及其他公司的信息技术专业标准体系进行了调研学习,最终形成了信息技术专业标准体系框架的思考建议…

【备战秋招】每日一题:4月23日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第三题-农村大亨 在线评测链接:P1247 题目内容 塔子哥是一个喜欢种田类的游戏的人,他觉得这样的游戏可以让他体验到农民的乐趣,同时也可以锻炼他的…

MYSQL中 find_in_set() 函数用法详解

MYSQL中 find_in_set() 函数用法详解 官方涵义(MySQL手册中语法说明) FIND_IN_SET(str,strlist) : str 要查询的字符串,strlist 需查询的字段,参数以”,”分隔,形式如 (1,2,6,8,10,22);该函数的…

分布式存储与并行处理环境配置:Hadoop、HBase和Spark等

本文介绍Linux系统中配置Hadoop、HBase和Spark环境,包括安装Java运行环境、下载安装包、进行配置和测试。通过这种方式,可以搭建一个强大的分布式计算环境,用于处理大规模数据集。为了成功配置Hadoop、HBase和Spark环境,需要理解它…

chatgpt赋能python:Python实现输出在同一行的技巧

Python实现输出在同一行的技巧 介绍 在Python中,我们经常需要将一些文本或者变量输出到控制台上,以便查看或者进行交互式调试。但是默认情况下,每次输出都会换行展示,这在某些情况下可能会让输出显得比较混乱,尤其是…

Ubuntu安装及使用教程

Ubuntu安装及使用教程 一、基本介绍二、vmware下安装ubuntu系统三、ubuntu系统使用 回到目录   回到末尾 一、基本介绍 对于ubuntu而言,就是linux操作系统的具体,而linux对于ubuntu来说就是他的抽象;在linux操作系统中,因为应用…

SSD202D-挂载根文件系统

参考链接: 启明云端分享|SSD20X 如何使用SD卡根文件系统_sudo./make_sd.sh_启明智显的博客-CSDN博客 启明云端分享|SSD202D核心板使用NFS_lx_mem=0x3f00000 mma_heap=mma_heap_name0,miu=0,sz=_启明智显的博客-CSDN博客 然后思路: 1.要在kernel打开文件系统格式支持 CONFIG_…

chatgpt赋能python:Python计算圆面积方法教程

Python计算圆面积方法教程 你是否想过如何用Python计算圆面积?圆形是一个基本的几何形状,计算圆的面积是一个必要的技能。Python作为一种流行的编程语言,可以帮助我们更轻松地计算圆的面积。本教程将介绍如何使用Python计算圆的面积。 什么…

【Red Hat7.9安装Oracle11g--调用图形化界面的几种方式】

【Red Hat7.9安装Oracle11g--调用图形化界面的几种方式】 🔻 一、续上一篇[【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】](https://blog.csdn.net/qq_41840843/article/details/131198718?spm1001.2014.3001.5501)⛳ 1.1 前言⛳ 1.2 方式一、使用Xmanag…

Mock和Vite-plugin-Mock的区别是什么?

简介 我不知道大家和我是否有一样的疑问,之前Mock.js用的挺好,为啥又出现了一个vite-plugin-mock,而且这个插件还依赖于Mock.js.那么他的优势到底是什么呢?如果你也有这样的疑问,本文最后会给出答案解开这个谜底 前言 我之前已经…

6月更新——企业互联,搭建起企业与企业之间的业务桥梁

企业互联 企业互联的作用是促进企业之间的合作和交流,提高企业的运营效率和竞争力。具体来说,企业互联可以实现以下几个方面的作用: 信息共享: 通过企业互联,企业可以方便地实现内部和外部信息的共享和传递。这样可…

chatgpt赋能python:Python装pipinstall的方法

Python装pip install的方法 如果你是一个Python开发者,那么你一定需要一些第三方库来辅助你完成一些任务。而pip就是Python的包管理器,它可以让你很方便地安装和管理第三方库。但是,在使用pip之前,我们需要先安装它。 什么是pip…

1.OpenStack介绍及环境部署(PS笔记)

当面对KVM集群的时候,我们对KVM的管理以及宿主机的管理就会遇到很大的难度,例如: 查看每一个宿主机有多少台KVM虚拟机? 查看每一个宿主机资源信息,每一个KVM虚拟机资源信息?查看每一台宿主机配置信息,每一个KVM虚拟机…

C#异步详解

异步编程是指在程序执行过程中,不需要等待某个操作完成,就可以继续执行后续的代码。比如我们开发了一个web页面中有一个上传文件功能,我们上传文件时使用异步操作,就不用等待文件的上传时间,可以先在网页上进行其他操作…