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

你能保证你的代码没有异常吗?

(一)Java中的异常

Java中的异常都来自于java.lang.Throwable类,从异常类型上分,Java中的异常可以分为Exception和Error。Exception异常可以被程序本身处理,Error无法被程序处理。

Exception异常又可以分为受检查异常和不受检查异常,所谓受检查异常是指那些在编程期间就需要把异常try/catch或throws出来的异常,不受检查异常是指在编程期间不需要通过代码来显式地catch出来。我画了个图展示异常的类型:

(二)如何处理异常

Error类型的异常属于尽量去避免而非在代码里去处理的异常,因此我们在处理异常章节主要介绍Exception类型的异常。

不受检查异常往往是程序员的代码逻辑疏忽导致,比如空指针异常,只需要在调用对象之前判断是否是空对象就可避免;下标越界异常只需要保证永远在下标范围内访问即可避免。

受检查异常必须在代码中通过try/catch或者throws才能通过编译,比如下面这段读取文件的代码:

public class ExceptionTest{
    public void readFile() throws FileNotFoundException {
        FileInputStream fileInputStream=new FileInputStream("xxx.text");
    }
}

当使用new FileInputStream(“xxx.text”)获取文件时,FileNotFoundException属于受检查异常,就必须抛出或者被捕获。除了throws之外,还可以使用try/catch

public class ExceptionTest{
    public void readFile() {
        try {
            FileInputStream fileInputStream=new FileInputStream("xxx.text");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
        }
    }
}

(三)try/catch与throws的区别

受检查异常的捕获有两种方式:try/catch和throws。区别在于,try/catch捕获到异常后直接在catch语句块里进行处理,处理完成之后程序继续往下执行。而throws则是将异常抛给它的上一级进行处理,程序就不会再往下执行了。

使用catch捕获到异常之后,我们可以对异常进行处理,常见的方式就是将异常打印出来或者写入到日志里。下面是Throwable类中的常用方法。

public String getMessage() //返回异常的简要信息
public String getLocalizedMessage() //返回异常的本地化信息,默认和getMessage是一样的,如果要加入本地化信息往往是子类重写这个方法
public String toString() //返回异常的更详细信息
public void printStackTrace() //在控制台输出异常信息。

try/catch之后往往还会更finally语句块,finally语句块中的代码会在程序处理完成最后被执行,不管是否进入异常。如果在代码块中有return语句,在return执行之前,finally语句块中的代码会被先执行。 finally 语句的返回值将会覆盖原始的返回值。

(四)自定义异常

除了使用Java自带的异常之外,我们还可以自己定义一些异常,自定义异常比较简单,继承Exception或者RuntimeException,通过构造方法将异常信息通过super返回。

public class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String message){
        super(message);
    }
    public MyException(String message,Throwable cause){
        super(message,cause);
    }
    public MyException(Throwable cause){
        super(cause);
    }
}

(五)总结

代码功力再强大,也有碰到异常的时候,合理作好异常处理可以让你代码更稳定,也更容易排查问题。我是鱼仔,我们下期再见。

相关文章:

  • OC之NSString/NSMutableString
  • 公司CEO和我说:在系统优化的时候,不要轻易用多线程
  • phalapi-进阶篇6(解决大量数据存储数据库分表分库拓展)
  • 快速理解工厂方法模式,及其在源码中的应用
  • 线上报了内存溢出异常,又不完全是内存溢出
  • 用代码告诉你“问世间情为何物,直教人生死相许”
  • 互联网公司的完整开发流程是怎样的?
  • 如何在SpringBoot启动时执行初始化操作,两个简单接口就可以实现
  • BZOJ4584 : [Apio2016]赛艇
  • 查准考证网站卡了整整一个小时进不去,被抢票支配的恐惧又来了
  • 【C#公共帮助类】 ToolsHelper帮助类
  • 这次终于把Spring的监听器讲明白了
  • jquery ajax分页 js对象
  • 详解单例模式及其在Sping中的最优实践
  • Magento Shell
  • __proto__ 和 prototype的关系
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • HTTP--网络协议分层,http历史(二)
  • javascript数组去重/查找/插入/删除
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • jquery cookie
  • python学习笔记 - ThreadLocal
  • Python学习之路13-记分
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spark RDD学习: aggregate函数
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于springcloud Gateway中的限流
  • 近期前端发展计划
  • 类orAPI - 收藏集 - 掘金
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 手机端车牌号码键盘的vue组件
  • 我的zsh配置, 2019最新方案
  • 一个SAP顾问在美国的这些年
  • 以太坊客户端Geth命令参数详解
  • MPAndroidChart 教程:Y轴 YAxis
  • 大数据全解:定义、价值及挑战
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​第20课 在Android Native开发中加入新的C++类
  • ​香农与信息论三大定律
  • #每天一道面试题# 什么是MySQL的回表查询
  • (3)llvm ir转换过程
  • (pojstep1.1.2)2654(直叙式模拟)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (五)Python 垃圾回收机制
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Unity3DUnity3D在android下调试
  • (转)关于多人操作数据的处理策略
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET建议使用的大小写命名原则