当前位置: 首页 > news >正文

【JavaSE】Java入门九(异常详解)

目录

异常 

1.Java中异常的体系结构

2.异常的处理

3.自定义异常类


异常 

       在Java中,将程序执行过程中发生的不正常行为称为异常,C语言中没有这个概念,接下来我们重点需要掌握异常处理体系(try, catch, throw, finally)以及如何自定义异常类。

1.Java中异常的体系结构

异常的种类繁多,Java内部维护了一个异常的体系结构如下:

 Java中可以说是把所有的异常体系都封装了起来,在程序中遇到各种问题时,JVM会直接定位异常情况并在控制台提示。

其中Throwable是异常体系的顶层类,它的内部实现了让Java虚拟机抛出错误的代码。他派生出两个重要的子类Error和Exception。

Error:指的是Java虚拟机无法解决的严重问题,比如JVM的内部错误,资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError

Exception:异常产生后程序员可以通过代码进行处理的异常,使程序继续运行。

2.异常的处理

Exception异常的子类可以分为两种,一种是RunTimeException类,我们称为是运行时异常,其余的异常我们都称为是编译时异常。下面是异常处理的注意事项:

  1. 我们可以在方法体内部通过throw抛出一个Exception异常,异常一旦抛出后续代码就不会执行,我们可以通过异常捕获来使后续代码可以继续执行。
  2. 只有Exception异常和它的子类能被处理。
  3. 如果抛出的是运行时异常或者运行时异常的子类,可以不用处理,直接交给JVM来处理。
  4. 如果抛出的是编译时异常,用户必须处理,否则就无法通过编译。

 异常的处理流程:

1.throws声明异常

public void OpenConfig(String filename) throws FileNotFoundException{
if(filename.equals("config.ini")){
throw new FileNotFoundException("配置文件名字不对");
}
// 打开文件
}

一般在定义类的时候使用 ,如果方法内部抛出多个异常。throws后面必须跟多个异常类型,也可以直接声明他们的父类。

throws声明异常并没有进行处理,而是留给了调用者进行处理,调用者在调用声明抛出异常的方法时,必须对该异常进行处理,或者继续使用throws抛出。

2.try-catch捕获并处理

try {
int[] array = {1,2,3};
System.out.println(array[3]); // 此处会抛出数组越界异常
}catch (NullPointerException e){ // 捕获时候捕获的是空指针异常--真正的异常无法被捕获到
e.printStackTrace();
}

如上所示,try中存在异常代码,catch用来捕获异常,并通过printStackTrace()方法来打印该异常的详细信息。

3.try-catch-finally语句

       在实际应用中,异常的出现具有不确定性,那就导致了在try语句中异常出现位置之后的剩余代码面临着一个问题,如果该异常抛出了,剩余代码就不执行,没抛出就执行,写程序时有些代码我们希望无论程序是否发生异常都需要被执行,因此Java引入了finally语句。

语法格式:
try{
// 可能会发生异常的代码
}catch(异常类型 e){
// 对捕获到的异常进行处理
}finally{
// 此处的语句无论是否发生异常,都会被执行到
}
// 如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行

finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally). 但是如果finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return.

3.自定义异常类

Java 中虽然已经内置了丰富的异常类 , 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构.

 

具体方式:
1. 自定义异常类,然后继承自 Exception 或者 RunTimeException
2. 实现一个带有 String 类型参数的构造方法,参数含义:出现异常的原因
class UserNameException extends Exception {
public UserNameException(String message) {
super(message);
}
}
class PasswordException extends Exception {
public PasswordException(String message) {
super(message);
}
}

 tips: 

  • 继承自Exception的异常默认是受查异常(编译时异常)
  • 继承自RuntimeException的异常默认为非受查异常(运行时异常)

相关文章:

  • 带你手把手解读rejail沙盒源码(0.9.72版本) (七) fnetfilter
  • 将 OpenLDAP 与 IBM Spectrum LSF 集成
  • 工业数据的特殊性和安全防护体系探索思考
  • 数据结构--图
  • VuePress安装及使用——使用 Markdown 创建你自己的博客网站和电子书
  • 23.ACL
  • LINUX SD卡备份的镜像+烧录启动时自动扩展最后一个分区
  • 【数据结构】什么是堆?
  • 2023年第四届 “赣网杯” 网络安全大赛 gwb-web3 Write UP【PHP 临时函数名特性 + 绕过trim函数】
  • 八股文打卡day2——计算机网络(2)
  • Maven知识
  • 【QT】解决QTableView鼠标点击合并单元格高亮显示问题
  • Jenkins在window下配置Android打包配置
  • 2023年超声波清洗机实测!清洁力强的超声波清洗机到底如何选择?
  • JWT令牌的作用和生成
  • SegmentFault for Android 3.0 发布
  • 07.Android之多媒体问题
  • Android 架构优化~MVP 架构改造
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • IndexedDB
  • Java反射-动态类加载和重新加载
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • mockjs让前端开发独立于后端
  • node学习系列之简单文件上传
  • 关于Flux,Vuex,Redux的思考
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 全栈开发——Linux
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 正则学习笔记
  • elasticsearch-head插件安装
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​水经微图Web1.5.0版即将上线
  • #NOIP 2014#Day.2 T3 解方程
  • $ git push -u origin master 推送到远程库出错
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (JS基础)String 类型
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)Sublime Text3配置Lua运行环境
  • (转)拼包函数及网络封包的异常处理(含代码)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bashrc在哪里,alias妙用
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理出现中文乱码的情况
  • .gitignore文件—git忽略文件
  • .java 9 找不到符号_java找不到符号
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET NPOI导出Excel详解
  • .Net7 环境安装配置
  • .NET面试题(二)
  • .NET文档生成工具ADB使用图文教程
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET业务框架的构建