throws throw 自定义异常
我们知道当程序遇到异常时除了用try-catch-finally来捕获异常外,还可以用throws和throw去抛出异常,使用异常处理可以定位问题所在处,方便修改程序代码:
例如利用try-catch-finally来捕获异常:
public class Test{public static void main(String[] args) { try {System.out.println(1/0);} catch (Exception e) {e.printStackTrace();//输出异常}}
}
输出结果:
java.lang.ArithmeticException: / by zeroat com.jd.pao.Test.main(Test.java:5)
还可以使用throw关键字来抛出异常:
public class Test{public static void main(String[] args) { throw new NullPointException("抛出一个空指针异常");}
}
输出结果:
Exception in thread "main" java.lang.NullPointerExceptionat com.jd.pao.Test.main(Test.java:4)
上述两种异常ArithmeticException(算数异常)、NullPointException(空指针异常)都属于RuntimeException(运行时异常),运行时异常比较容易掌握,检查时异常就需要用心记住了,它较运行时异常有点复杂,不过在详述检查时异常之前,我们首先要知道:一个异常如果直接或间接继承RuntimeException,该异常就属于运行时异常;如果是继承Exception,则该异常属于检查时异常,这两句话在自定义异常中也非常重要,例如:
用throw抛出一个由检查时异常创建的对象时有两种处理方式:
第一种是在方法参数列表括号的后面加上throws 异常类
public class Test {public static void main(String[] args) throws Exception { throw new Exception("抛出一个检查时异常");}
}
输出结果:
Exception in thread "main" java.lang.Exception: 抛出一个检查时异常at com.jd.pao.Test.main(Test.java:7)
另一种是用try-catch-finally来捕获检查时异常:
public class Test {public static void main(String[] args){ try {throw new Exception("用try-catch来捕获一个检查时异常");} catch (Exception e) {e.printStackTrace();}}
}
输出结果:
java.lang.Exception: 用try-catch来捕获一个检查时异常at com.jd.pao.Test.main(Test.java:8)
这两种方式有区别:
当使用throws时是将错误抛给别人,异常下面的代码不执行;而使用try-catch-finally时是将错误抛给自己,异常下面的代码也会执行(笔者是这样记的,将错误抛给自己,自己选的路,死活也要走完),且要记住throw下面不能直接跟代码(就如return下面不能直接写代码一样),例如:
public class Test{public static void main(String[] args) throws Exception{if(true) {throw new Exception("此处用throws去抛出异常,所以下满代码不能执行");//后面不能直接写代码,否则报错}System.out.println("我就不执行");}
}
输出结果:
Exception in thread "main" java.lang.Exception: 此处用throws去抛出异常,所以下满代码不能执行at com.jd.pao.Test.main(Test.java:9)
public class Test{public static void main(String[] args){try {throw new Exception("此处用try-catch来捕获一个检查时异常,下面代码会执行");} catch (Exception e) {e.printStackTrace();} System.out.println("我要执行喽!");}
}
输出结果:
java.lang.Exception: 此处用try-catch来捕获一个检查时异常,下面代码会执行
我要执行喽!at com.jd.pao.Test.main(Test.java:8)
下面我们来结合上面说说自定义异常,我们会发现有时已有的异常类并不能完全阐明错误的具体类型,这时就要我们自己定义一个异常类来具体阐明问题的根本:
自定义异常类要继承已有的异常类,通常继承RuntimeException(执行时异常)和Exception(检查时异常),
public void Custom extends RuntimeException{public Custom (String s){super(s);}
}
public void Custom extends Exception{public Custom (String s){super(s);}
}
上述两种自定义类的使用规则就和上面讲的一样,要区分是继承RuntimeException还是Exception!
下面是一个练习,想看的可以看一下,不看了也无所谓:
package com.jd.pao;public class Test {public static void div(int a,int b) throws Exception{//使用try-catch默认有throws,为便于理解,此处显示出来if(b==0) {try {throw new Exception("分母不能为0");//因为此处通过try-catch捕获了异常,} catch (Exception e) {System.out.println("分母为0时会执行");e.printStackTrace();}}else{System.out.println(a/b);}}public static void main(String[] args) {try {div(1,0);//也就相当于此处已无异常,所以当此处执行完毕后,不会跳到catch代码块里} catch (Exception e) {System.out.println("永远不会执行");}}
}
输出结果:
分母为0时会执行
java.lang.Exception: 分母不能为0at com.jd.pao.Test.div(Test.java:8)at com.jd.pao.Test.main(Test.java:20)
package com.jd.pao;public class Test {public static void div(int a,int b) throws Exception{//此处必须要显式使用throwsif(b==0) { throw new Exception("分母不能为0");//因为此处将异常抛出, }else {System.out.println(a/b);}}public static void main(String[] args) {try {div(1,0);//所以此处会报错,出现异常,会跳到catch代码块里} catch (Exception e) {System.out.println("异常时会执行");}}
}
输出结果:
异常时会执行
相关文章:

配置hadoop集群一
花了1天时间最终把环境搭建好了。整理了一下,希望对想学习hadoop的有所帮助。资料下载:http://pan.baidu.com/s/1kTupgkn包括了linux虚拟机。jdk, hadoop1.0环境搭建准备工作:hadoop_master 192.168.50.158hadoop_slave 192.168.50.136网络…

将前台日期格式转成与数据库日期格式相对应,后台java转数据库日期格式
前台到后台java时data日期类型的转化 在实体类中用DataTimeFormat,这样设置即使传过来是空的字符串也是可以转的,要和前面传过来的格式一致,如 XmlElement(name"BeginDate") DateTimeFormat(pattern"yyyy-MM-dd") privat…

Ubuntu18.04安装cudnn
下载Cudnn cudnn下载版本要与cudn版本相对应。笔者cudn为10.0,则cudnn选7.65。下载地址: https://developer.nvidia.com/rdp/cudnn-archive 下载for Linux这个。 编译 解压后运行以下命令: sudo cp cuda/include/cudnn.h /usr/local/cuda…

Linux17-磁盘分区、文件系统、逻辑卷管理LVM
目录 一、磁盘分区、文件系统、永久挂载 1.1、MBR分区方案 1.2、使用fdisk、mkfs、partprobe、blkid、lsblk等命令管理MBR分区 1.3、swap分区 1.4、GPT分区方案、使用gdisk管理GPT分区 二、逻辑卷LVM(Logical Volume Management) 2.1、物理卷PV、…

javascript基础 之 json
1,json是用于存储和传输的数据格式 全称:JSON 英文全称 JavaScript Object Notation json转化为javascript的规则: 数据为 键/值 对。数据由逗号分隔。大括号保存对象方括号保存数组<body> <p id"hehe"></p> <…

List常用方法总结 遍历集合的方法
List接口继承Collection接口,该接口属于数据结构中的线性结构,用户可以根据元素的整数索引来访问元素,换句话说就是List集合是按照存储的顺序保存的,且从0开始数,说白了就是就相当于一个数组,不同的是数组要…

ubuntu下载安装MaskRCNN-benchmark
在window下,配个环境,一堆错误,一周多都没解决。换到ubuntu下,不到一天就配好了 强烈建议直接去ubuntu下配置,千万别在window环境下配置。 一、下载anaconda,创建虚拟环境 下载anaconda的步骤读者可以去…
积跬步,聚小流------ps有用小技巧,改变png图标颜色
积跬步,聚小流------ps有用小技巧,改变png图标颜色 * 实现效果: 原图: 改动后: * 实现目的: 满足为实现不同界面色彩搭配改动png图标的颜色 * 实现方法: 1、打开Photoshop工具,导…

linux常用运维工具uptime、iostat、vmstat、sar
目录 一、uptime 二、iostat 三、vmstat 四、sar 一、uptime uptime可以告诉你系统已经运行了多久。uptime命令回显一行信息,包括:系统运行了多久,目前有多少用户在登录,过去1、5、15分钟系统平均负载。这些内容和命令w回显的…

《人类简史》八、融合统一(下)——宗教的法则、历史的混沌
在前面,我们说了金钱和帝国,今天我们聊一聊宗教。宗教的话题算是比较敏感的,必定很多人是拥有自己的宗教信仰的,如果在下面的论述过程之中,让您觉得有什么不妥的地方,还希望能够理解。我并没有贬低或者蔑视…

Set集合常用方法 遍历Set集合的方法
Set接口继承Collection接口,它与List集合有一个区别就是:List集合可以保存重复的数据,而Set集合不可以。Set接口有三个常用实现类: HashSet,特点: 它不按照存储的顺序保存,具有不确定性&#…

ubuntu下使用conda出现solving environment失败
更换anaconda的源(注意是anaconda的源,不是ubuntu的源) sudo gedit ./.condarc在出现的空文档中写入 channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free- htt…

centos8编译openssl-1.0.2u、openssl-1.1.1k
目录 一、给openssl-1.0.2u打包rpm 二、编译安装openssl-1.1.1k 三、给openssl-1.1.1k打包rpm(不推荐!) 近日openssl爆出拒绝服务、证书绕过漏洞,CVE编号CVE-2021-3449、CVE-2021-3450。 解决方法: CentOS7默认ope…

jquery 1.7.2源码解析(二)构造jquery对象
构造jquery对象 jQuery对象是一个类数组对象。 一)构造函数jQuery() 构造函数的7种用法: 1.jQuery(selector [, context ]) 传入字符串参数:检查该字符串是选择器表达式还是HTML代码。如果是选择器表达式,则遍历文档查找匹配的DOM元素&#x…

Map接口及其常用方法
Map集合基于键(key)和值(value)的映射,每个键只能映射一个值,也就是说key不可以重复(当然喽,重复的话就按最后一个为准)。键和值都可以是任何引用数据类型的值;且一对键值的存放是无序的。 Map常用的实现类…

C++计时函数
推荐使用chrono计时函数 #include<iostream> #include<vector> #include<algorithm> #include<chrono> using namespace std; class mycom { public:bool operator()(pair<int,int> p1,pair<int,int> p2){return p1.first < p2.first;…

最长递增子序列的两种解法
以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<int>& nums) {const int size nums.size();if (size 0) { return 0; } vector<int> dp(size, 1);int res…

【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
目录 一、故障重现 二、救援过程 一、故障重现 近日为了解决CVE-2021-3449: 拒绝服务漏洞、CVE-2021-3450: 证书校验漏洞,自己编译了openssl-1.1.1k。 亲测发现:只升级openssl的版本,动态库版本没有升级,系统可用。 升级openss…

C++类class
一、定义 构造函数:在定义一个类对象时会自动调用,可用于实现一些功能,比如new一个内存。 构造函数,没有返回值也不写void函数名称与类名相同构造函数可以有参数,因此可以发生重载程序在调用对象时候会自动调用构造&…

pandas学习之Series结构
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 系列(值的集合) DataFrame数据包(系列对象的集合) panel(数据文件对象的集合) 一个系列对象可以保存许多数据类型,包括 浮点数表示浮点数…

Java中的Map集合遍历总结(详尽版)
因为Map集合中的键值对排列无序,所以不能用传统的for循环来遍历,只能使用加强循环(for-each)和迭代器进行遍历。 让我们通过例子来了解Map集合的遍历: package gather; import java.util.HashMap; import java.util.Iterator; import java.…

Ansible01-Ansible基础和部署
目录 一、Ansible简介 二、安装部署Ansible 2.1、在控制节点安装ansible 2.2、对Linux和Unix受管节点要求 2.3、基于 Microsoft Windows 的受管主机 2.4、受管网络设备 三、Ansible配置文件 3.1、ansible.cfg配置文件推荐做法 3.2、ansible.cfg配置文件内容 四、Ansi…

C++/C文件读取
1、C文件操作 ofstream:写操作ifstream: 读操作fstream : 读写操作 打开方式解释ios::in为读文件而打开文件ios::out为写文件而打开文件ios::ate初始位置:文件尾ios::app追加方式写文件ios::trunc如果文件存在先删除,…

HashSet中的add()方法( 二 )(详尽版)
本篇接着上一篇:(详尽版)HashSet中的add()方法( 一 )(详尽版) 有些东西上一篇说过了,这里就不再赘述了,具体说一下再次添加与第一次添加的区别: import java.util.HashSet;public …

20155321 实验四 Android程序设计
20155321 实验四 Android程序设计 安装Android studio成功 任务一:Android Stuidio的安装测试: 参考《Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)》第二十四章: 安装 Android Stuidio完成Hello World, 要求修改res目录…

Ansible02-实施playbook
一、编写和运行playbook 1.1、编写playbook play 是针对清单中选定的主机运行的一组有序任务。playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的 play 组成的列表。 playbook 是以 YAML 格式编写的文本文件,通常使用扩展名 .yml 保存。…

linux下解压缩文件中文乱码问题的解决
在windows上压缩的文件,是以系统默认编码中文来压缩文件。由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码。 虽然2005年就有人把这报告为bug, 但是info-zip的官方网站没有把自动识别编码列入计划&a…

ROS知识点总结
1、ROS功能包的目录下不能有中文 2、 WorkSpace --- 自定义的工作空间|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库…

Effective Java:对于全部对象都通用的方法
前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书。可以把我们的Java功底提升一个档次,我还是比較推荐的。这里我主要就关于覆盖equals、hashCode和toString方法来做一个笔记总结。希望可以与君共勉。 概述: 这一章主要是说明一些对…

HashSet中的add()方法( 一 )(详尽版)
让我们用例子来理解add()方法的底层代码吧,Let’s go: import java.util.HashSet;public class Test {public static void main(String[] args) {HashSet<String> names new HashSet<String>();names.add("Jim");//向HashMap集合…