java8--异常处理(java疯狂讲义3复习笔记)

try,catch,finally,throw,throws
java将异常分为两种,Checked异常和Runtime异常.

IndexOutOfBoundsException
NumberFormatException
ArithmeticException
NullPointerException
捕获异常时,先捕获小异常,再捕获大异常,
从java7开始,一个catch块可以捕获多种类型的异常
public static void main(String[] args)
{
try
{
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = a / b;
System.out.println("您输入的两个数相除的结果是:" + c );
}
catch (IndexOutOfBoundsException|NumberFormatException
|ArithmeticException ie)
{
System.out.println("程序发生了数组越界、数字格式异常、算术异常之一");
// 捕捉多异常时,异常变量默认有final修饰,
// 所以下面代码有错:
// ie = new ArithmeticException("test"); // ①
}
catch (Exception e)
{
System.out.println("未知异常");
// 捕捉一个类型的异常时,异常变量没有final修饰
// 所以下面代码完全正确。
e = new RuntimeException("test"); // ②
}
}

打印到控制台:
ioe.printStackTrace(System.out); 或者
ioe.printStackTrace();
10.2.5 使用finally回收资源
程序在try块里打开的某些物理资源(比如IO),必须显示的回收.
java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用的内存.

public static void main(String[] args)
{
FileInputStream fis = null;
try
{
fis = new FileInputStream("a.txt");
}
catch (IOException ioe)
{
System.out.println(ioe.getMessage());
// return语句强制方法返回,依然会执行finally
// return ; // ①
// 使用exit来退出虚拟机,不会执行finally
System.exit(1); // ②
}
finally
{
// 关闭磁盘文件,回收资源 .这也是个异常处理嵌套
if (fis != null)
{
try
{
fis.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
System.out.println("执行finally块里的资源回收!");
}
}
通常情况下,不要在finally快中使用return或throw等导致方法终止的语句,一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return.throw语句失效.

10.2.7 java7 的自动关闭资源的try语句
try后紧跟一对圆括号,里面声明或初始化一个或多个必须被显示关闭的资源.为了保证try语句可以正常的关闭资源,这些资源实现类必须实现AutoCloseable或Colseable接口,实现这两个接口就必须实现close()方法.
实现Closeable接口的close()方法只能抛出IOException,实现AutoCloseable接口的close()方法可以抛出任何异常.
public static void main(String[] args)
throws IOException
{
try (
// 声明、初始化两个可关闭的资源
// try语句会自动关闭这两个资源。
BufferedReader br = new BufferedReader(
new FileReader("src/learnJava/LearnException.java"));
PrintStream ps = new PrintStream(new
FileOutputStream("a.txt")))
{
// 使用两个资源
System.out.println(br.readLine());
ps.println("庄生晓梦迷蝴蝶");
}
}
Checked异常和Runtime异常体系
所有的RuntimeException类及其子类的示例被称为Runtime异常;其他异常被称为Checked异常.
10.3.1 使用throws声明抛出异常
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("b.txt");
}
如果某段代码中调用了一个带throws声明的方法,该方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常.也就是说,调用该方法时,要么放在try块中显示捕获该异常,要么在另一个带throws声明抛出的方法中.
方法重写时,throws声明抛出的异常应该是父类异常的子类或同类.
大部分推荐使用Runtime异常,而不是使用Checked异常,
public static void main(String[] args){
try{
FileInputStream fis = new FileInputStream("b.txt");
}catch(IOException e){
throw new RuntimeException(e);
}
}
如果throw语句抛出是Checked异常,则改异常或者被调用者显示抛出,或者在try块里.
如果throw语句抛出的是Runtime异常,则该语句无需放在try块里,也无需放在带throws声明抛出的方法中:既可以用try来捕获该异常,也可以完全不理会.
10.4.2 自定义异常类.
用户自定义的异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException基类,通常需要覆写有参和无参两个构造方法.
public class AuctionException extends Exception
{
// 无参数的构造器
public AuctionException(){} //①
// 带一个字符串参数的构造器
public AuctionException(String msg) //②
{
super(msg);
}
}
throw和catch结合使用,能再次捕捉到bid方法中的异常,并对该异常进行处理
public class AuctionTest
{
private double initPrice = 30.0;
// 因为该方法中显式抛出了AuctionException异常,
// 所以此处需要声明抛出AuctionException异常
public void bid(String bidPrice)
throws AuctionException
{
double d = 0.0;
try
{
d = Double.parseDouble(bidPrice);
}
catch (Exception e)
{
// 此处完成本方法中可以对异常执行的修复处理,
// 此处仅仅是在控制台打印异常跟踪栈信息。
e.printStackTrace();
// 再次抛出自定义异常
throw new AuctionException("竞拍价必须是数值,"
+ "不能包含其他字符!");
}
if (initPrice > d)
{
throw new AuctionException("竞拍价比起拍价低,"
+ "不允许竞拍!");
}
initPrice = d;
}
public static void main(String[] args)
{
AuctionTest at = new AuctionTest();
try
{
at.bid("df");
}
catch (AuctionException ae)
{
// 再次捕捉到bid方法中的异常。并对该异常进行处理
System.err.println(ae.getMessage());
}
}
}
10.4.4 java7增强的throw语句
public static void main(String[] args)
// Java 6认为①号代码可能抛出Exception,
// 所以此处声明抛出Exception
// throws Exception
// Java 7会检查①号代码可能抛出异常的实际类型,
// 因此此处只需声明抛出FileNotFoundException即可。
throws FileNotFoundException
{
try
{
FileInputStream fis = new FileInputStream("b.txt");
}
catch (Exception ex)
{
ex.printStackTrace();
throw ex; // ①
// throw new RuntimeException(ex);
}
}
或者
public static void main(String[] args)
// Java 6认为①号代码可能抛出Exception,
// 所以此处声明抛出Exception
// throws Exception
// Java 7会检查①号代码可能抛出异常的实际类型,
// 因此此处只需声明抛出FileNotFoundException即可。
// throws FileNotFoundException
{
try
{
FileInputStream fis = new FileInputStream("b.txt");
}
catch (Exception ex)
{
ex.printStackTrace();
// throw ex; // ①
throw new RuntimeException(ex);
}
}
构造器如下
public class SalException extends Exception
{
public SalException(){}
public SalException(String msg)
{
super(msg);
}
// 创建一个可以接受Throwable参数的构造器
public SalException(Throwable t)
{
super(t);
}
}
10.5 java的异常跟踪栈
public class LearnException {
public static void main(String[] args)
{
firstMethod();
}
public static void firstMethod()
{
secondMethod();
}
public static void secondMethod()
{
thirdMethod();
}
public static void thirdMethod()
{
throw new SelfException("自定义异常信息");
}
}
class SelfException extends RuntimeException
{
SelfException(){}
SelfException(String msg)
{
super(msg);
}
}
Exception in thread "main" learnJava.SelfException: 自定义异常信息
at learnJava.LearnException.thirdMethod(LearnException.java:29)
at learnJava.LearnException.secondMethod(LearnException.java:25)
at learnJava.LearnException.firstMethod(LearnException.java:21)
at learnJava.LearnException.main(LearnException.java:17)

1.不要过度使用异常,包括
1.不能用异常抛出代替所有错误处理
2.不要使用异常处理来代替流程控制.
2.不要使用过于庞大的try块
正确的做法是,把可能出现异常的程序分别放到单独的try块中处理.
3.尽量避免使用一个catch来捕获所有异常,特别是一些关键的代码
4.不要忽略捕获到的异常
如何处理捕获到的异常
1.checked异常,要尽可能修复
2.重新抛出新的异常.把当前运行环境下要做的事情尽量昨晚,然后把异常包装成当前层的异常,重新抛给上层调用者
3.在合适的层处理异常.如果当前层不知道如何处理异常,就不要在当前从用catch捕获异常,直接使用throws声明抛出异常,让上层调用者来负责处理该异常.

java8--异常处理(java疯狂讲义3复习笔记)的更多相关文章
- java8--类加载机制与反射(java疯狂讲义3复习笔记)
本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...
- java8--NIO(java疯狂讲义3复习笔记)
NIO采用内存映射文件的方式处理输入输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入输出比传统的 ...
- java8--网络编程(java疯狂讲义3复习笔记)
重点复习一下网络通信和代理 java的网络通信很简单,服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信. 需要重点看的工具类:I ...
- java8--Mysql数据库与JDBC编程(java疯狂讲义3复习笔记)
JDBC:java database connectivity 数据库基本命令: 启动 show databases; create database [if not exists] 数据库名; do ...
- java8--多线程(java疯狂讲义3复习笔记)
多线程这块,平时用的框架里都封装好了,只有写批处理和工具包时用过几次.现在水平仅仅限于会用的程度,需要全面深入学习多线程. 主要内容:创建线程,启动线程,控制线程,多线程的同步,线程池,使用线程安全的 ...
- java8--IO工具类(java疯狂讲义3复习笔记)
Paths类 public static void pathTest(){ Path path = Paths.get("~"); System.out.println(path) ...
- java8--IO(java疯狂讲义3复习笔记)
产生文件 File file = new File("abc.txt"); if(!file.exists()){ System.out.println(file.exists() ...
- 参考《Java疯狂讲义》
参考<Java疯狂讲义>Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例 1. Lambda ...
- java疯狂讲义--摘要
1.一个java文件中可以有多个类,但是只能有一个public类,并且该类需要与文件同名 第6章 对象的软,弱和虚引用 1.强引用---创建一个对象,并把这个对象赋给一个引用变量.一个对象被一个以上的 ...
随机推荐
- vue 错误处理
https://sentry.io/for/vue/ https://cn.vuejs.org/v2/guide/deployment.html#跟踪运行时错误
- 南邮CTF--md5_碰撞
南邮CTF--难题笔记 题目:md5 collision (md5 碰撞) 解析: 经过阅读源码后,发现其代码是要求 a !=b 且 md5(a) == md5(b) 才会显示flag,利用PHP语言 ...
- Spider-天眼查字体反爬
字体反爬也就是自定义字体反爬,通过调用自定义的woff文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容! 1.思路 近期在爬取天 ...
- 数据结构实验4:C++实现循环队列
实验4 4.1 实验目的 熟练掌握队列的顺序存储结构和链式存储结构. 熟练掌握队列的有关算法设计,并在循环顺序队列和链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 4.2 实验要求 ...
- 七、整合SQL基础和PL-SQL基础
--Oracle数据库重要知识点整理 2017-01-24 soulsjie 目录 --一.创建及维护表... 2 --1.1 创建... 2 --1.2 维护表... 2 --二.临时表的分类.创建 ...
- UVA10200-Prime Time/HDU2161-Primes,例题讲解,牛逼的费马小定理和欧拉函数判素数。
10200 - Prime Time 此题极坑(本菜太弱),鉴定完毕,9遍过. 题意:很简单的求一个区间 ...
- [luoguP2129] L国的战斗续之多路出击(模拟 || 矩阵)
传送门 1.模拟 easy #include <cstdio> #define N 500001 int n, m; int X[N], Y[N], x[N], y[N], a = 1, ...
- 亚瑟王(bzoj 4008)
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- 【BZOJ3939】Cow Hopscotch(动态开点线段树)
题意: 就像人类喜欢跳格子游戏一样,FJ的奶牛们发明了一种新的跳格子游戏.虽然这种接近一吨的笨拙的动物玩跳格子游戏几乎总是不愉快地结束,但是这并没有阻止奶牛们在每天下午参加跳格子游戏 游戏在一个R* ...
- linux下程序JDBC连接不到mysql数据库
今天在linux下部署一个 JavaEE项目的时候总是连接不到Mysql数据库,检查之后发现连接池的配置确定是对的,进入linux服务器之后以mysql -uname -ppassword连接总是报A ...