Java异常机制Throwable

2023-11-09

Java中异常的概念以及处理异常

在Java程序运行期间出现了一个错误,这个错误可能是由于文件包含了错误信息,或者是由于网络连接出现问题,也可以是因为使用了无效的数组下标,或者是试图使用一个没有被赋值的对象引用而造成的,我们称这样的错误为异常。在出现异常时用户期望程序能够采用一些理性的行为。如果由于出现错误而使得程序操作没有完成,这时程序应该:
  • 返回到一种安全状态,并能够让用户执行一些其他命令
  • 允许用户保存所有操作的结果,并以适当的方法终止程序,

异常类的结构体系

                         
从上图中我们可以知道,所有的异常类都是由Throwable继承下来的,但在下一层立即分为两个分支:Error和Exception。
一、Error
1、Error类层次描述了Java运行时系统的内部错误和资源耗尽错误。对于这类错误是无法难通过程序来解决的,所以程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通知给用户,并尽力使程序安全地终止。当然这类情况是很少出现的
二、Exception
在设计Java程序时,Exception是我们需要重点关注的错误,在Java程序中Exception又可以分为两类:Runtime Exception、其它异常如:IOException。
1、派生于Runtime Exception 的异常主要包含以下几种情况 
  • 错误的类型转换
  • 数组访问越界
  • 访问空指针
2、不是派生于Runtime Exception的异常包含
  • 试图在文件尾部读取数据
  • 试图打开一个错误格式的URL
  • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在
这里总结一条:如果是出现RuntimeException,那么就一定是自己的问题。
三、运行时异常和检查性异常
1、在Java语言中将派生于Error或RuntimeException类的所有异常称为运行时异常,这类异常我们可以不处理,当出现这个的异常时,总是由虚拟机接管,比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。运行时异常我们常见的有 ClassCastException(类转换异常) IndexOutOfBoundsException(数组越界) NullPointerException(空指针) ArrayStoreException(数据存储异常,操作数组时类型不一致) 还有IO操作的BufferOverflowException异常 ;
2、除了运行时异常,其它的异常都被称为 检查性异常 我们经常遇到的IO异常及sql异常就属于检查式异常。对于这种异常,Java编译器要求我们必须对出现的这些异常进行catch 所以 面对这种异常不管我们是否愿意,只能自己去写一堆catch来捕捉这些异常。常见的查检性异常有:FileNotFoundException 文件不存在异常、SQLException SQL异常等。

抛出和捕捉异常的方法

一、使用throws抛出异常
1、使用throws抛出异常的情况:
  • 调用一个抛出已检查异常的方法,如:FileInputStream构造器
  • 程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常
  • 程序出现错误,如:a[-1]=0会抛出一个ArrayIndexOutOfBoundsException这样的未检查异常
  • Java虚拟机和运行时库出现的内部异常。
public class A**Exception   {   
              private String id;   
              public void setID(String id)  throws IllegalException{
                          if(id.length() == 7) {  
                                 this.id = id;   
                         }else{   
                               throw new IllegalArgumentException("参数长度不是7位");   
                        }   
             }   
}  

上面的代码,表示就抛出了一个IllegalArgumentException类型的异常,如果在一个方法体中抛出了异常,那么就希望调用者能够去捕获异常,在Java语言中可以通过throws来声明某个方法可能会抛出的异常,这样就可以让调用者明白该方法可能会出现什么异常,要及时去捕获。

二、使用try{....}catch(){....}finally{....}捕捉异常
 try{
        //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容  
     }catch (Exception e) {
        //除非try里面执行代码发生了异常,否则这里的代码不会执行 
     }finally{
       //不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally 
     }
关于try...catch...finally方法的说明:
package com.exception;
public class TryCatchUse {
	public static void main(String[] args) {
	   try{
			System.out.println("try statement...");
			//Integer.valueOf("2");//没有异常  
			Integer.valueOf("admin");//有异常
	     }catch (NumberFormatException e) {
			System.out.println("catch statement...");
			e.printStackTrace();//打印出异常信息
	     }finally{
	    	System.out.println("finally statement...");
	     }
	     System.out.println("after finally statement...");
	}
}
a、如果try中没有出现异常,那么catch中的代码不会执行。执行完try中代码后直接执行finally中代码。
b、如果try中出现异常,就会停止运行try中的代码,直接跳到catch中运行其中代码,catch中代码运行完后,再运行finally中的代码。
c、如果没有出现异常,但是try中存在return,或者是出现异常,但是catch中存在异常,这时finally后的代码都不会执行。
d、finally并不是捕获异常的必须部分,当我们需要关闭一些由于异常而无法关闭的资源时需要用到finally。
下面是一组结果图:
a、没有异常的try...catch...finally...,且try中或catch中都不含有return
                   
b、有异常,但是catch中有return 的try...catch...finally...

                    
c、没有异常,但是try中有return的try...catch...finally...
                   
d、有异常,但是catch中没的return的情况:
                 
总结:finally不是必须的,但是只要有finally,不管有没有异常finally中的代码都必须要执行,其次,如果try中和catch中都不主动跳出程序即都不包含return,那么不管会不会出现异常,try...catch...finally 块后面的代码都会正常执行,最后,一旦try中的某一行出现异常,就会直接跳到catch中,try中位于这一行后面的代码都不会执行。 
三、自定义异常类
     在程序中,可能会遇到任何标准异常类都没有能够充分地描述清楚的问题。在这种情况下,需要创建自己的异常类,这个自己定义的异常类一般都是继承Exception或者Exception的子类。通常情况下,自己定义的异常类应该有两个构造器,一个是默认的构造器,另一个是带有详细描述信息的构造器。下面就是定义自己的异常类的两种方式:
package com.exception;
/*当标准的异常类不能充分的描述清楚问题时,这时需要自定义异常类。
 * 自定义的异常类有两种方式
 * 一是继承Exception这个异常主类,或者是继承Exception这个主类的子类
 * 二是继承Throwable类
 * */
public class MyException extends Exception{
	private static final long serialVersionUID = 1L;
    public MyException(){
    	super();
    }
    public MyException(String msg){
    	super(msg);
    }
    public MyException(String msg,Throwable cause){
    	super(msg,cause);
    }
    public MyException(Throwable cause){
    	super(cause);
    }
}
//自定义异常类的第二种方式
class MyException_another extends Throwable{
	private static final long serialVersionUID = 1L;
	public MyException_another() {
		super();
	}
	public MyException_another(String msg) {
		super(msg);
	}
	public MyException_another(String msg, Throwable cause) {
		super(msg, cause);
	}
	public MyException_another(Throwable cause) {
		super(cause);
	}
	
}


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

Java异常机制Throwable 的相关文章

随机推荐

  • LeetCode198.打家劫舍(动态规划)

    题目描述 来自LeetCode 思路 这道题和01背包很像 这件房屋偷不偷跟前一间房屋是否偷了有关 比如说这是第i间房屋 如果第i 1间房屋偷了 那第i间房屋就不能再偷 那最大值就跟前i 1间房屋的金额最大值有关 如果第i 1间房屋没偷 那
  • hp linux 禁用u盘启动,BIOS关闭Secure Boot(安全启动)方法大全(联想,华硕,DELL,HP等品牌)...

    在预装win10系统的电脑上BIOS中安全启动Secure Boot是默认开启的 如果你要安装其他系统 如Win7 Linux等系统那么需要关闭才可以 不然会无启动 这小编整理了联想 华硕 DELL HP等品牌关闭Secure Boot 安
  • 斗罗大陆解算法—魂环的最佳获取法

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 背
  • 关于kettle的一些使用笔记

    Kettle是一款国外开源的ETL工具 纯java编写 对于办公自动化来说也是一款神器 好了直入主题 这里只记录了kettle的一些常用的转换的组件作用和意义 并不含软件安装和使用过程 因为这个过程很简单 界面很友好 可以自己摸索 vers
  • Android9.0 iptables用INetd实现ip白名单的实现

    1 前言 在9 0的系统rom定制化开发中 在system中netd网络这块的产品需要中 会要求设置屏蔽ip地址之内的功能 liunx中iptables命令也是比较重要的 接下来就来在INetd这块实现ip白名单的的相关功能 就是在app中
  • 理解Linux下的进程和程序,分析fork、execve和进程切换

    本次实验从整体上理解进程创建 可执行文件的加载和进程执行进程切换 重点理解分析fork execve和进程切换 一 理解task struct数据结构 进程是处于执行期的程序以及它所管理的资源 如打开的文件 挂起的信号 进程状态 地址空间等
  • 经理人必看的十个管理网站

    经理人必看的十个管理网站 管理这玩艺远远看着如同象牙塔中的佛牙舍利 可观而不可玩 其实身在其中无非就是一张窗户纸 没有什么大不了的 管理这玩艺远远看着如同象牙塔中的佛牙舍利 可观而不可玩 其实身在其中无非就是一张窗户纸 没有什么大不了的 网
  • C# NPOI写excel文件,设置某个单元格为自动筛选

    https blog csdn net qq 40467670 article details 118102078 如标题所示 附上几行代码 HSSFWorkbook workbook new HSSFWorkbook 创建工作表 var
  • Uva 10474 Where is the Marble?(排序与检索)

    本题若掌握了sort 和lower bound 两个函数 就无难点 include
  • 通关6级之词汇(2021.05.29)

    前言 这篇词汇是通关6级系列第一篇文章 这篇文章和4级有大部分内容是一样的 所以如果学了4级的课程再学这个会很轻松 更多相关文章点击阅读 通关4级之阅读理解 通关4级之听力 通关4级之写作 通关4级之翻译 通关4级之词汇 通关6级之词汇 点
  • STM32 ST-LINK Utility程序烧录方法

    打开软件过后点击Target connect 出现以下界面表示STlink链接成功 如果出现没有检测到stlink的话 首先查看是否安装驱动程序 再重新插拔电脑usb口的stlink连接线 或者链接到主机后方的usb口 再重复以上步骤链接
  • Fire Net

    点击打开链接 Problem Description Suppose that we have a square city with straight streets A map of a city is a square board wi
  • 利用python对b站某GPT-4解说视频的近万条弹幕进行爬取、数据挖掘、数据分析、弹幕数量预测及情绪分类

    目录 一 利用Python爬取弹幕 二 利用几行代码直接生成词云 三 将弹幕属性和内容放入mysql当中 四 分析弹幕在视频各节点的数量 1 分析视频各个片段出现的弹幕数量 2 分析视频各大章节出现的弹幕数量 3 分析视频各小节出现的弹幕数
  • Learning Java language Fundamentals

    Chapter 2 Learning Java language fundamentals exercises 1 What is Unicode Unicode is a computing industry standard for c
  • 炒股新手技巧

    技巧一 关于止损和止赢的问题 我觉得很重要 止赢和止损的设置对股民来说尤为重要 有很多散户会设立止损 但是不会止赢 今天有必要和大家探讨一下 止损的设立大家都知道 设定一个固定的亏损率 到达位置严格执行 但是止赢 一般的散户都不会 为什么说
  • 用mybatis批处理, 编程式事务,CompletableFuture异步处理,多线程,线程池,list 分页,实现多张表大批量插入

    目录 概述 准备工作 创建数据库表 创建Java实体类 创建MyBatis映射文件和DAO接口 编写Java代码实现多张表大批量插入的功能 总结 1 概述 在实际的开发中 我们经常需要将大量的数据插入到数据库中 如果使用单条插入的方式 会导
  • vs2017 找不到源文件stdio.h解决方法

    这个问题网上又不少人提出 我的vs出现这个问题是因为我电脑重装系统了 原来的项目所采用windows SDK 已经发生了变化 因此解决的办法是 项目 gt 属性 gt 配置属性 gt 常规 gt windows SDK版本 将其换成你现在的
  • 【论文阅读】【因果关系】

    文章目录 因果理论的三个层级 张含望 因果推理在计算机视觉中的进展 浙江大学助理教授况琨 因果推理和稳定学习 因果理论的三个层级 该篇是本人入门因果 CV的随笔 期间会借鉴记录别人的理解 引用的部分会给出原始连接 如有侵权请联系我删除 Ju
  • EEPROM AT24C08的操作

    EEPROM应该是学习IIC总线时候最先接触的东西了 EEPROM的优点是可以随机存取 不像Flash存储器一样需要先擦除在能写入 而且擦写次数多存储时间长 但是缺点是存储空间非常有限 像我这用的Atmel的AT24C08只有8Kbit的存
  • Java异常机制Throwable

    Java中异常的概念以及处理异常 在Java程序运行期间出现了一个错误 这个错误可能是由于文件包含了错误信息 或者是由于网络连接出现问题 也可以是因为使用了无效的数组下标 或者是试图使用一个没有被赋值的对象引用而造成的 我们称这样的错误为异