Java的异常(分类、处理原则、应用实例、注意事项)

2023-11-16

//学习笔记

异常

异常:是在运行时期发生的不正常情况。

在java中用类的形式对不正常情况进行了描述和封装对象。

描述不正常的情况的类,就称为异常类
以前,通常将正常流程代码和问题处理代码相结合
现在将正常流程代码和问题处理代码分离,提高阅读性。

其实异常就是java通过面向对象的思想将问题封装成了对象。

    public static void sleep(int time)
    	{
    		if(time<0)
    		{
    //			抛出 new FuTime();//就代表着时间为负的情况,这个对象中会包含着问题的名称,信息,位置等信息。
    		}
    		if(time>100000)
    		{
    //			抛出 new BigTime();
    		}
    		System.out.println("我睡。。。"+time);
    	}
    }

用异常类对其进行描述。
不同的问题用不同的类进行具体的描述。 比如角标越界。空指针等等。
问题很多,意味着描述的类也很多,
将其共性进行向上抽取,形成了异常体系。

最终问题(不正常情况)就分成了两大类。
|–1,一般不可处理的。Error
特点:是由jvm抛出的严重性的问题。
这种问题发生一般不针对性处理。直接修改程序
|–2,可以处理的。Exception

Throwable:无论是error,还是异常,问题,问题发生就应该可以抛出,让调用者知道并处理。
//该体系的特点就在于Throwable及其所有的子类都具有可抛性
可抛性到底指的是什么呢?怎么体现可抛性呢?
其实是通过两个关键字来体现的。
throws 、throw :凡是可以被这两个关键字所操作的类和对象都具备可抛性.

该体系的特点:
子类的后缀名都是用其父类名作为后缀,阅读性很强。

举例:

         //自定义异常中的信息报告,但是所用异常类都是Java中已经定义过的
             class Demo
                {
                	public int method(int[] arr,int index)
                	{		
            
            		if(arr==null)
            			throw new NullPointerException("数组的引用不能为空!");
            
            		if(index>=arr.length)
            		{
        			throw new ArrayIndexOutOfBoundsException("
    
    数组的角标越界啦,哥们,你是不是疯了?:"+index);
        		}
        		if(index<0)
        		{
        			throw new ArrayIndexOutOfBoundsException("数组的角标不能为负数,哥们,你是真疯了!:"+index);
        		}
        		return arr[index];
        	}
        }
        
        class  ExceptionDemo2
        {
        	public static void main(String[] args) 
        	{
        		int[] arr = new int[3];
        		
        		Demo d = new Demo();
        		int num = d.method(null,-30); //测试 ,不同的参数
        		System.out.println("num="+num);
        		System.out.println("over");
        	}
        	
        }

对于角标是整数不存在,可以用角标越界表示,
对于负数为角标的情况,准备用负数角标异常来表示。

负数角标这种异常在java中并没有定义过。
那就按照java异常的创建思想,面向对象,将负数角标进行自定义描述。并封装成对象。

这种自定义的问题描述成为自定义异常
注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性,才可以被两个关键字所操作,throws 、throw

    class FuShuIndexException extends Exception  //这是自定义的异常类
    {
    	FuShuIndexException()
    	{}
    
    	
    	FuShuIndexException(String msg)
    	{
    		super(msg);  //交给异常类去办
    	}
    }
    class Demo
    {
    	public int method(int[] arr,int index)throws FuShuIndexException//声明抛出
    	{		

		if(arr==null)
			throw new NullPointerException("数组的引用不能为空!");

		if(index>=arr.length)
		{
			throw new ArrayIndexOutOfBoundsException("数组的角标越界啦,哥们,你是不是疯了?:"+index);
		}
		if(index<0)
		{
			throw new FuShuIndexException("角标变成负数啦!!"); //抛自定义异常
		}
		return arr[index];
	}
    }

异常的分类:

1,编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。
这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。
这样的问题都可以针对性的处理。

2,编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类
这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部状态的改变导致的。
那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。

所以自定义异常时,要么继承Exception。要么继承RuntimeException。

throws 和throw的区别:

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

捕捉

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

具体格式是:

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

    class Demo
    {
    	public int method(int[] arr,int index)throws FuShuIndexException
    	{	
    	
    		if(index<0)
    			throw new FuShuIndexException(“角标变成负数了”);
    			
    		return arr[index];
    	}
    }
    
    class  ExceptionDemo4
    {
    	public static void main(String[] args) 
    	{
    		int[] arr = new int[3];		
    		Demo d = new Demo();
    		try
    		{
    			int num = d.method(null,-1);
    			System.out.println("num="+num);
    			
    		}
    		
    	
    		catch (FuShuIndexException e)
    		{
    			System.out.println("message:"+e.getMessage());  //输出异常信息
			    System.out.println("string:"+e.toString());  //异常类名+信息
				e.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法。
    			System.out.println("负数角标异常!!!!");
    		}
    	
    		System.out.println("over");
    	}
    	
    }

异常处理的原则

1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。
否则必须在函数内用trycatch捕捉,否则编译失败。

2,如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。

3,什么时候catch,什么时候throws 呢?
功能内容可以解决,用catch。
解决不了,用throws告诉调用者,由调用者解决 。

4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。
catch(Exception e)//多catch父类的catch放在最下面。

finally

一定会被执行党的代码块。
通常用于关闭(释放)资源。

try catch finally 代码块组合特点:

1,
try catch finally

2,
try catch(多个)当没有必要资源需要释放时,可以不用定义finally。

3,
try finally 异常无法直接catch处理,但是资源需要关闭。

    try
    	{
    		//开启资源。
    		throw new Exception();
    	}
    	finally
    	{
    		//关闭资源。
    		
    	}

异常的应用实例

这里举了一个十分生动的例子:毕老师用电脑上课。
问题领域中涉及两个对象。
毕老师,电脑。
分析其中的问题。
比如:电脑蓝屏啦。冒烟啦。这会造成无法正常上课。看看异常是怎么被声明和解决的吧。

    class LanPingException extends Exception //蓝屏异常
    {
    	LanPingException(String msg)
    	{
    		super(msg);
    	}
    }
    
    class MaoYanException extends Exception //冒烟异常
    {
    	MaoYanException(String msg)
    	{
    		super(msg);
    	}
    }
    
    class NoPlanException extends Exception  //意外情况的异常
    {
    	NoPlanException(String msg)
    	{
    		super(msg);
    	}
    }
    
    class Computer   //电脑类
    {
    	private int state = 2;    //改变这个参数来进行不同情况的试验
    	public void run()throws LanPingException,MaoYanException
    	{
    		if(state==1)
    			throw new LanPingException("电脑蓝屏啦!!");
    		if(state==2)
    			throw new MaoYanException("电脑冒烟啦!!");
    
    		System.out.println("电脑运行");
    	}
    	public void reset()
    	{
    		state = 0;
    		System.out.println("电脑重启");
    	}
    }
    
    class Teacher   //老师类
    {
    	private String name;
    	private Computer comp;
    	Teacher(String name)//构造函数
    	{
    		this.name = name;
    		comp = new Computer();
    	}
    	
    	public void prelect()throws NoPlanException  //讲课方法,声明了意外异常,因为这个异常需要被抛出
    	{
    		try
    		{
    			comp.run();
    			System.out.println(name+"讲课");
    			
    		}
    		catch (LanPingException e)   //处理蓝屏异常,不用抛出
    		{
    			System.out.println(e.toString());
    			comp.reset();
    			prelect();
    		}
    		catch (MaoYanException e)  //处理冒烟异常
    		{
    			System.out.println(e.toString());
    			test();
    			//可以对电脑进行维修。
                //	throw e;  //公司不会关心电脑是否冒烟,只关心能否上课
    			throw new NoPlanException("课时进度无法完成,原因:"+e.getMessage());
    		}
    
    	}
    	public void test()
    	{
    		System.out.println("大家练习");
    	}
    }	
    
    class ExceptionTest 
    {
    	public static void main(String[] args) 
    	{
    		Teacher t  = new Teacher("毕老师");
    		try
    		{
    			t.prelect();
    			
    		}
    		catch (NoPlanException e)
    		{
    			System.out.println(e.toString()+"......");
    			System.out.println("换人");
    
    		}
    	}
    }

异常的注意事项

1,子类在覆盖父类方法时,父类的方法如果抛出了异常,
那么子类的方法只能抛出父类的异常或者该异常的子类。

2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try .

    interface  Inter
    {
    	void function();
    }
    
    class D implements Inter
    {
    	public void function()//throws Exception  不能抛
    	{}
    }
    
    
    class A extends Exception 
    {
    }
    
    class B extends A
    {
    }
    class C extends Exception 
    {
    }
    
    
 

     /*  Exception
        	|--A
        		|--B
        	|--C
       */      //这里表示异常类的继承关系
    
    class Fu
    {
    	void show()throws A
    	{}
    }
    
    
    class Test
    {
    	void method(Fu f)//Fu f  = new Zi();
    	{
    		try
    		{
    			f.show();
    			
    		}
    		catch (A  a)
    		{
    		}
    	}
    }
    
    
    class Zi extends Fu
    {
    	void show()throws C
    	{
    	
    	}
    }
    
    
    
    
    class  
    {
    	public static void main(String[] args) 
    	{
    		Test t = new Test();
    		t.show(new Zi());
    	}
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java的异常(分类、处理原则、应用实例、注意事项) 的相关文章

随机推荐

  • 谁能成为真正的「以太坊Killer」?公链aelf准备从经济模型入手

    由于底层技术差异不大 许多公链在基础设施建设 性能标新 以及跨链互操作等方面的实力并没有太多距离 因此 如果想在公链赛道上胜出 成为真正的 以太坊Killer 就需要 另辟蹊径 从经济模式上入手 继而形成差异竞争优势 作者 碳6 编辑 黑土
  • transformers之中mt5和t5的区别

    为了查看transformers结构之中mt5结构和t5结构的区别 这里采用代码对比法 相同的程序分别调用mt5结构和t5结构 使用mt5的结构 from transformers import T5Tokenizer T5ForCondi
  • 一份 Go 开发者学习路线图

    Go 开发者路线图 如何成为一名 Go 开发者的路线图 参考 Go 开发者路线图
  • deepin更新到15.10后任务栏(dde-dock)消失

    两个提示 libdde disk mount plugin so 和系统不兼容 libsystem tray so 和系统不兼容 在终端运行dde dock后 DockPlugin load plugin failed 无法加载库 usr
  • 开源图片文件服务器,XImageServer

    软件简介 XImageServer 一个超级简单的PHP图片服务器 适用对象 中小型网站 图片存储在自己的服务器 并且毫无预见性的时候会使用同一图片的 不同尺寸 特点 1 核心只有一个PHP文件 2 前端图片服务器惰性从NFS等其他文件系统
  • 【STM32标准库】【基础知识】时钟系统

    文章目录 时钟 时钟的作用 时钟的产生 F4系列的时钟系统 时钟源 总线 标准库的时钟设置 内部高速时钟设置 外部高速时钟设置 AHB时钟设置 APB1 2时钟设置 默认值 文章基于适用于STM32F4系列 作者使用STM32F401CCU
  • Linux MISC 驱动实验

    目录 一 MISC 设备驱动简介 misc deregister 函数 二 MISC驱动编写 1 编写框架 2 platform结构体对应的函数 2 宏定义和miscbeep设备结构体 3 定义miscdevice结构体 字符设备操作集 4
  • 浅谈Nginx主配置文件

    浅谈Nginx主配置文件 1 Nginx配置文件组成部分 2 Nginx主配置文件结构 3 Nginx 全局配置 1 正常运行必备的配置 2 性能优化相关的配置 3 事件驱动相关的配置 4 调试和定位配置 1 Nginx配置文件组成部分 N
  • 【Mac使用系列】Mac锁屏及快捷键

    mac锁屏办法 我有所尝试 可用系统自带锁屏快捷键 Ctrl Command Q 或者参考方法2 直接设置TouchBar 这两种办法 亲测可用 我直接设置了TouchBar 锁屏解锁离得很近 比较方便 随你选 Ctrl Shift Pow
  • Python3,selenium动态下载某库PPT文档,省下的钱可以撸串了!!!

    selenium动态下载某库PPT文档 1 引言 2 代码实战 2 1 思路分析 2 2 页面分析 2 3 代码展示 2 4 代码解析 3 总结 1 引言 小鱼 你看啥嘞 把显示屏亮度调的这么暗 小屌丝 这 没有你想的那样 我这是再学习算法
  • property_get函数使用

    在 域的使用方法 int property get const char key char value const char default value int property set const char key const char
  • 设置div中的背景颜色及div中的字体颜色

    div style background black color white 菜单3 div 这样就设置了这个div的背景颜色为黑色 即background属性的颜色 字体颜色为白色 即color属性的颜色 效果如下图
  • C语言学习开头以及个人目标

    一 自我介绍 本人是一个来自某末流211大学的本科生 因为高考的时候发挥失常了 原本可以去一些末985垫底专业或中211的热门专业 最后只能是双非一本随便挑 但是因为不甘心失败就冲了好学校的差专业 最终还是调剂了材料专业 后来好好学习想转专
  • vi/vim 设置tab为4个空格

    vim 编辑器中 tab 有时不是4个空格 代码看起来比较凌乱 配置文件位置 etc vim vimrc Kali linux set ts 4 set softtabstop 4 set shiftwidth 4 set expandta
  • 转帖:DirectShow 在VS2005中环境配置

    转载请标明是引用于 http blog csdn net chenyujing1234 baseclasses参考代码 VS2005下编译通过 http www rayfile com zh cn files 12ac1b0c 7335 1
  • 关于QQ的技巧

    让电脑只能上到自己的QQ 任何QQ都无法登陆 首先把自己的QQ设置为自动登陆模式 接下来最关键的就是移动或删除QQ主目录下的WizardCtrl dll文件 这样就算别的QQ怎么样也登陆不了的了 如果你想上两个QQ的话就把QQ整个目录复制多
  • 2022年 IEEE VIS 科学可视化与体渲染论文整理与分析

    因为最近工作的关系 需要研究一下IEEE VIS中2017年以后的与我之前主要方向 体渲染 医学可视化 有关的论文 我把这些年全部的论文进行了筛选和梳理 总共筛选出57篇论文 打算写一个文章来记录这些内容 这个栏目是2022年的6篇论文的介
  • spark集群搭建与mysql元数据管理

    找个spark集群搭建是针对于上一篇hadoop的基础上搭建的 所以spark的版本也是要按照着hadoop版本进行下载 1 解压spark 修改spark的 etc profile的home目录 2 安装SCALA 并配置SCALA HO
  • ElementUI的简单使用方法讲解

    这里我们以引入button按钮为例 其实很多表单 或者 时间 等等的组件 引入方式都是一样的 举一反三吧 首先 yarn add element ui S 让我们来安装这个包 main js 全局注册 element ui这个组件 完整引入
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性