1.异常

在Java中,每个异常都是一个名叫Throwable的类的一个实例

我们常用的try-catch-finally语句

  • try

尝试去执行try语句块里的内容,如果有异常,将其捕获,并执行catch语句块中的代码

  • catch

在catch语句的参数中我们定义了具体的异常类型,但是这些具体的异常都是Exception的子类,所以我们可以通过将参数改为Exception e 来捕获所有异常(但是不建议这么做,或者把捕获异常基类放到最后,因为有的时候你需要针对不同的异常做出一些不同的动作)

  • finally

finally "最后",语句块中的内容最后都会被执行

  • 处理异常

在捕获了异常之后,我们还需要处理这些异常,我们可以将这些异常的消息输出,或者在捕获之后再抛出另外的异常: 常用的消息输出方式就是getMessage()以及printStackTrace()

2. 自定义异常

官方给出的异常类型(JDK 8)大部分都是没见过的,(羞羞)

不要紧,我们可以自己来定义属于自己的异常。

具体的异常都是继承自Exception类,所以我们要自定义的异常也需要继承这个基类。

我们自定义异常命名MyException,需要继承基类Exception,然后我们调用基类的构造方法,带一个参数:

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

然后我们测试这个异常,因为是测试,所以直接抛出定义的异常:

public class Test {
public static void main(String[] args)throws MyException{
try{
throw new MyException("自定义异常");
}catch (MyException e){
System.out.println(e.getMessage());
}
}
}

打印异常结果

3. 查看异常信息

有时候我们会需要查看异常信息来进行调试,JDK中给出了3种继承自Throwable基类的方法

toString()方法

在讲方法前我们先看看 Throwable类中覆盖了的toString()方法:

这里面的意思是: toString()方法返回一个字符串,代表了Throwable实例(异常)的信息,具体格式为:对象名字: 本地化的信息

示例:

运行出来的结果第二行:

java.io.FileNotFoundException: test.txt(系统找不到指定的文件。)
at ...

java.io.FileNotFoundException就是Throwable的实例,text.txt...后面的信息就是本地化的信息了,针对不同的位置给出具体的信息,用来调试就能很快进行定位

getMessage() :

the detail message string of this Throwable instance (which may be null)
将Throwable实例(通常所说的异常)的具体信息以String类型给出(可能不存在)

printStackTrace()

这个方法有三种类型:无参,带参数PrintStream和带参数PrintWriter

无参的printStackTrace()方法也就是我们平常使用的查看异常信息的方式,直接在控制台打印
带参数PrintStream(打印输出流):能够将信息通过流输出至其他地方,

做个测试:

import java.io.*;

public class Test {
public static void main(String[] args) throws IOException{
OutputStream out;
try{
throw new RuntimeException();
}catch (RuntimeException e){
out = new FileOutputStream("C:\\Users\\94545\\Desktop\\test.txt");
//将FileOutputStream作为PrintStream的输出流
PrintStream printStream = new PrintStream(out);
e.printStackTrace(printStream);
out.close();
printStream.close();
}
}
}

成功打印

带参数PrintWriter(字符打印输出流):将信息输出至其他地方
import java.io.*;

public class Test {
public static void main(String[] args) throws Exception{
OutputStream out;
try{
throw new RuntimeException();
}catch (RuntimeException e){
out = new FileOutputStream("C:\\Users\\94545\\Desktop\\test.txt");
PrintWriter printWriter = new PrintWriter(out,true);
e.printStackTrace(printWriter);
out.close();
printWriter.close();
}
}
}

打印成功!

扩展

你知道 throw和throws有什么区别?

举个例子来说: 在方法A中,如果在产生异常的时候,不需要马上捕获,在方法B调用方法A的时候再进行捕获,那么就在A的方法名后添加throws,如果需要在方法A中进行捕获,则直接使用throw

所以两者区别,其实在于究竟在哪个地方处理异常

小结

看捕获异常的对象是谁,再决定应该如何来使用

用户输入数据的格式永远都是正确的,选择打开的文件也一定存在,并且永远不会出现bug ——《Java核心技术 卷一》

涨姿势:Java 异常?尝试自定义异常的更多相关文章

  1. Java异常之自定义异常

    哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...

  2. 讲一讲java异常及自定义异常

    1.异常,说白了.两种,一种就是就是不能让代码通过编译的异常.另一种就是程序运行期间出现的异常.异常就是错误,只要出现异常,程序就不会向下运行了.就不会执行后面的代码了.这时候就可以通过显示statc ...

  3. Java异常02——自定义异常

    Error与Exception与自定义异常 Error与Exception Error Exception 自定义异常 快捷键: ctrl + alt + t  package exception.d ...

  4. Java异常机制,自定义异常以及spring boot异常设计方案

    异常机制: 异常概念 异常分类 异常的处理方法 自定义异常 springboot 的异常解决方案

  5. “全栈2019”Java异常第二十章:自定义异常详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. java——异常类、异常捕获、finally、异常抛出、自定义异常

    编译错误:由于编写程序不符合程序的语法规定而导致的语法问题. 运行错误:能够顺利的编译通过,但是在程序运行过程中产生的错误. java异常类都是由Throwable类派生而来的,派生出来的两个分支分别 ...

  7. 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链

    不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...

  8. java 异常

    1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return  和  throw的区别 return 符合函数要求的值    throw  有问题的时候用它结束 ...

  9. JAVA异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  10. 【开发技术】java异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

随机推荐

  1. MongoDB 教程(七):插入文档、更新文档、删除文档

    MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式 —— BSON是一种类json的二进制形式的存储格式,简称Binary JSON. MongoDB ...

  2. Lucene全文检索入门使用

    一. 什么是全文检索 全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置.当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程 全文检 ...

  3. 第7天【find命令、if语句、磁盘管理、文件系统管理】

    find命令详解(01)_recv Find及文件特殊权限: 文件查找工具: Find Find [OPTON]…[查找路径] [查找条件] [处理动作] 查找路径:指定具体目标路径,默认为当前路径 ...

  4. let,const 声明的变量不会绑定给window对象 而var会

    先来看一道题 let id = 2; let json = { id: 1, show:function(){ setTimeout(function(){ console.log(this.id); ...

  5. Spring MVC 复习笔记05

    1. 上传图片 1.1 springmvc中对多部件类型解析 在 页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对mu ...

  6. 【转载】关于nginx以及内核参数的配置

    nginx应用总结(2)--突破高并发的性能优化  原文地址:https://www.cnblogs.com/kevingrace/p/6094007.html 在日常的运维工作中,经常会用到ngin ...

  7. 使用map()的小陷阱:parseInt

    假设我们想要把一个字符串数组的每一项转换成整数,我们很自然就想到了把parseInt作为回调函数传给map()函数,但这样做可能会出现意想不到的结果: var strArr = ["1&qu ...

  8. 关于dos命令行脚本编写

    dos常用命令另查 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共用的,只是cmd文件中允许 ...

  9. 自动化测试-15.selenium单选框与复选框状态判断

    本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...

  10. C++中的指针,指针函数和函数指针

    指针是C或C++中的一大难题,因此弄懂指针对C和C++的学习有很大的帮助,最近一直在研究指针,因此写一篇随笔把心得记录一下. 简单来说指针也是一种变量,只不过指针变量所存储的不是我们直观上看到的,而是 ...