33. Java对异常处理的两种方式
- 声明异常
throw: 关键字,用于抛出一个指定的异常对象
必须写在方法内部、必须是Exception或Exception的子类对象
throws: 用于方法声明上,表示当前方法不处理该异常,提醒调用者处理异常
方法内部抛出编译器异常
/**
* <h1>方式一: 声明异常</h1>
* throw, throws
* */
public class DeclareException {
/**
* <h2>使用 throw 关键字抛出运行时异常</h2>
* */
private static boolean validate01(String name) {
if (null == name) {
throw new NullPointerException("name is null...");
}
return "qinyi".equals(name);
}
/**
* <h2>编译期异常, 必须处理这个异常, 或者是由 throws 继续抛出给上层调用者处理</h2>
* */
private static void validate02(String name) throws EOFException,
FileNotFoundException {
if (null == name) {
throw new EOFException("name is null...");
}
if (!"qinyi".equals(name)) {
throw new FileNotFoundException("name is not qinyi...");
}
}
}
- 捕获异常
三个关键字:try、catch、finally
try:该代码块内编写可能产生异常的代码
catch:用于进行某种异常的捕获并处理
finaly: 不管代码出现异常与否,都会对该代码块执行
/**
* <h1>方式2: 捕获异常</h1>
* try...catch...finally
* */
@SuppressWarnings("all")
public class CatchException {
/**
* <h2>validate01 抛出单个异常</h2>
* */
private static boolean validate01(String name) {
if (null == name) {
throw new NullPointerException("name is null...");
}
return "qinyi".equals(name);
}
/**
* <h2>validate02 抛出多个异常</h2>
* */
private static boolean validate02(String name) {
if (null == name) {
throw new NullPointerException("name is null...");
}
if ("".equals(name)) {
throw new IllegalArgumentException("name is blank...");
}
if (!"qinyi".equals(name)) {
throw new RuntimeException("name is not qinyi...");
}
return true;
}
/**
* <h2>打开并关闭 Stream</h2>
* */
private static void openAndCloseStream() {
Stream<Path> pathStream = null;
try {
pathStream = Files.list(Paths.get("/tmp"));
List<Path> paths = pathStream.collect(Collectors.toList());
System.out.println(paths.size());
// ....
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (null != pathStream) {
pathStream.close();
}
}
}
public static void main(String[] args) {
// 1. 捕获单个异常
try {
validate01(null);
} catch (Throwable th) {
System.out.println(th.getMessage());
th.printStackTrace();
}
// 2.1 捕获多个异常 -- 第一种方法, 多一个异常一次捕获多次处理
try {
validate02("");
} catch (NullPointerException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
} catch (RuntimeException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
// 2.2 捕获多个异常 -- 第二种方式, 一个 try, 一个 catch
try {
validate02("");
} catch (NullPointerException | IllegalArgumentException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
// 2.3 捕获多个异常 -- 第三种方式, 定义一个范围更大的父类异常对象
try {
validate02("");
} catch (RuntimeException ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
}
33. Java对异常处理的两种方式的更多相关文章
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...
- Java新建线程的两种方式
Java新建线程有两种方式,一种是通过继承Thread类,一种是实现Runnable接口,下面是新建线程的两种方式. 我们假设有个竞赛,有一个选手A做俯卧撑,一个选手B做仰卧起坐.分别为两个线程: p ...
- Java实现多线程的两种方式
实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...
- [Java] HashMap遍历的两种方式
Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...
- Java实现深克隆的两种方式
序列化和依次克隆各个可变的引用类型都可以实现深克隆,但是序列化的效率并不理想 下面是两种实现深克隆的实例,并且测试类对两种方法进行了对比: 1.重写clone方法使用父类中的clone()方法实现深克 ...
- java文件读写的两种方式
今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOExceptio ...
- K:java中序列化的两种方式—Serializable或Externalizable
在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...
- java 实现websocket的两种方式
简单说明 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring与we ...
- java实现同步的两种方式
同步是多线程中的重要概念.同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果.同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字. 给一个方法 ...
- Java线程创建的两种方式
java多线程总结一:线程的两种创建方式及优劣比较 (一)---之创建线程的两种方式 java实现多线程的两种方法的比较
随机推荐
- 设计模式 > 单一职责原则
SOLID原则并非单纯的1个原则,而是由5个设计原则组成的,它们分别是单一职责原则,开闭原则,里氏替换原则,接口隔离原则和依赖反转原则. 单一职责原则(SRP) 定义:一个类或者模块只负责完成一个职责 ...
- vue移动端禁止弹层穿透、点击元素滚动到视图中心杂文日志
一,需求是在无限列card加载页面,点击任何一个card的显示图表按钮,图表自适应居中显示,显示遮罩层,页面可以滑动,但不能穿透点击 一个无限列表加载页面设置遮罩层一般需求是页面不能滑动的,但这比较特 ...
- div里元素横向排列 居中对齐
<div> <img src="//s.weituibao.com/1582958061265/mlogo.png" alt=&quo ...
- GPT和MBR分区格式
目前市面上磁盘有两个格式,一种是GPT(Master Boot Record)分区一种是MBR(Master Boot Record)分区. 像UEFI用于取代老旧的BIOS,而GPT则为的是取代老旧 ...
- python菜鸟学习: 11. 装饰器的基础用法
# -*- coding: utf-8 -*-# decorator# 定义:本质是函数,就是为其他函数添加附件功能# 原则:# 1.不能修改被装饰的函数的源代码# 2.不能修改被装饰的函数的调用方式 ...
- LENGTH,LENGTHB
LENGTH 1.语法 length(string) 2.说明: 统计字段的字符长度 3.示例: select length('abcd') from dual; --返回值:4 select len ...
- C# load and unload dll
1. Invoker Any c# project Create a new application domain Create a proxy within the domain Unload th ...
- Apache SSI远程命令执行漏洞复现
漏洞原理:当目标服务器开启了SSI与CGI支持,就可以上传shtml文件,并利用语法执行任意命令,例如<!- - #exec cmd="ls"- ->,cmd后面跟要执 ...
- 【ubuntu20 】主机,虚拟机ubuntu,开发板三者的ping通
1.主机有线网卡设为静态ip,步骤如图 2.开发板运行的linux设为静态IP 修改文件 vi /etc/network/interfaces # Configure Loopback auto l ...
- 剑指 Offer 栈与队列
09. 用两个栈实现队列 没啥意思 不要想复杂了 就是暴力 class CQueue { public: CQueue() { } /* 一个主栈 一个缓存栈 来回导 得到队头 copy后一端变空了 ...