【Java 进阶篇】【第二课】异常处理
来源:互联网 发布:淘宝抱歉无法付款方式 编辑:程序博客网 时间:2024/05/29 15:24
异常处理的存在是为了:
允许程序员跳过无法处理的问题,继续开发后续的工作,或根据异常做出更加聪明的处理方式。
Java中存在一类对象叫“异常对象”。
当异常情况发生时,就会暗战预先的设定,抛出(throw) 代表当前状况的对象;抛出其实就是一种特殊的返回方式,该线程会暂停,逐层退出调用,直到遇到异常处理器(Exception Handler)。
异常处理器可以捕捉(catch)的异常对象,然后根据对象来决定下一步是提醒用户、处理一次还是退出程序等等..
基本结构
异常处理器由 try, catch, finally(这个可以没有) 以及随后的程序块组成 :
try { ...;}catch() { ...;}catch() { ...;}finally { ...;}
异常处理器 监视try后面的程序块,catch的括号中需要有一个参数,用来代表索要捕捉的异常的类型。catch会捕捉相应的类型和它的派生类。
try所监视的程序库可能抛出不止一种类型的异常,所以一个异常处理器可以有多个catch模块。
finally后面的程序块,无论是否发生异常,都会被执行。
我们在try中放入可能出错,需要监视的程序,在catch中设计应对异常的方案。
简单例子
1 public class two 2 { 3 public two() throws IOException 4 { 5 BufferedReader br = new BufferedReader(new FileReader("file.txt")); 6 try 7 { 8 StringBuilder sb = new StringBuilder(); 9 String line = br.readLine();10 11 while (line != null) 12 {13 sb.append(line);14 sb.append("\n");15 line = br.readLine();16 }17 String everything = sb.toString();18 } 19 catch (IOException e)20 {21 e.printStackTrace();22 System.out.println("IO problem");23 }24 finally 25 {26 br.close();27 }28 }29 }
第19行,如果我们捕捉到了这样异常的话(即IOException类对象的e),可以对该对象对象。比如调用对象的printStackTrace(),打印出当前栈的状况 。
无论是否有异常,程序最终会进入finally块中,清空文件描述符所占据的资源。
异常类Trowable
Java中的异常类都继承自Trowable类。一个Throwable类的对象都可以抛出(throw)。
Throwable对象可以分为两组。
一组是unchecked异常(图中橘黄色),异常处理机制往往不用于这组异常:
Error类通常是指Java的内部错误以及如资源耗尽的错误。当Error(及其衍生类)发生时,我们不能在编程层面上解决Error,所以应该直接退出程序。
RuntimeException(及其衍生类)是Java程序自身造成的,也就是说,由于程序员在编程时犯错。
RuntimeException完全可以通过修正Java程序避免。比如将一个类型的对象转换成没有继承关系的另一个类型,即ClassCastException。这类异常应该并且可以避免。
一组是checked异常:
这些类是由编程与环境互动造成程序在运行时出错。
比如读取文件时,由于文件本身有错误,发生IOException。再比如网络服务器临时更改URL指向,造成MalformedURLException。文件系统和网络服务器是在Java环境之外的,并不是程序员所能控制的。如果程序员可以预期异常,可以利用异常处理机制来制定应对预案。比如文件出问题时,提醒系统管理员。再比如在网络服务器出现问题时,提醒用户,并等待网络服务器恢复。
异常处理机制主要是用于处理这样的异常。
异常处理例子
1 public class two 2 { 3 public static void main(String[] args) 4 { 5 Battery aBattery = new Battery(2); 6 aBattery.useBattery(-2.5); 7 } 8 } 9 10 class Battery11 {12 private double power = 0.0; // percentage of battery13 Battery(double p)14 {15 power = p;16 }17 18 public boolean useBattery(double p)19 {20 try 21 {22 test(p);23 } 24 catch (Exception e) 25 {26 System.out.println("catch Exception");27 System.out.println(e.getMessage());28 p = 0.0;29 }30 31 if (this.power >= p) 32 {33 this.power = this.power - p;34 return true;35 } 36 else37 {38 this.power = 0.0;39 return false;40 }41 }42 43 private void test(double p) throws Exception 44 {45 if (p < 0) {46 Exception e = new Exception("p must be positive");47 throw e;48 }49 }50 }
运行结果为:
catch Exception
p must be positive
自定义异常类
在代码中加入自己的异常类。
一般都是继承来创建新的异常类。在继承时,我们往往需要重写构造方法。异常有两个构造方法,一个没有参数,一个有一个String参数:
class BatteryUsageException extends Exception{ public BatteryUsageException() {} public BatteryUsageException( String msg) { super(msg); System.out.println("this is BatteryUsageException"); }}
然后修改Battery类中test函数为:
private void test(double p) throws BatteryUsageException { if (p < 0) { BatteryUsageException e = new BatteryUsageException("p must be positive"); throw e; }
}
这样的话输出的内容就是:
this is BatteryUsageException
catch Exception
p must be positive
好啦,全部完啦
我再把源代码贴一次吧
1 public class two 2 { 3 public static void main(String[] args) 4 { 5 Battery aBattery = new Battery(2); 6 aBattery.useBattery(-2.5); 7 } 8 } 9 10 class Battery11 {12 private double power = 0.0; // percentage of battery13 Battery(double p)14 {15 power = p;16 }17 18 public boolean useBattery(double p)19 {20 try 21 {22 test(p);23 } 24 catch (Exception e) 25 {26 System.out.println("catch Exception");27 System.out.println(e.getMessage());28 p = 0.0;29 }30 31 if (this.power >= p) 32 {33 this.power = this.power - p;34 return true;35 } 36 else37 {38 this.power = 0.0;39 return false;40 }41 }42 43 private void test(double p) throws BatteryUsageException 44 {45 if (p < 0) 46 {47 BatteryUsageException e = new BatteryUsageException("p must be positive");48 throw e;49 }50 }51 }52 53 class BatteryUsageException extends Exception54 {55 public BatteryUsageException() {}56 public BatteryUsageException( String msg)57 {58 super(msg);59 System.out.println("this is BatteryUsageException");60 }61 }
- 【Java 进阶篇】【第二课】异常处理
- Java--异常处理进阶
- Java进阶----异常处理
- Java总结第二篇 异常处理--基本概念
- Java进阶02 异常处理
- Java进阶(异常处理)
- Java进阶02 异常处理
- Java进阶02 异常处理
- Java进阶02 异常处理
- Java中异常处理进阶篇(一)
- 第二十六篇:JAVA处理未捕获异常
- 《Robust java》学习-第二章异常处理
- 异常统一处理进阶
- 异常处理第二题
- JAVA进阶2.2——用try...catch处理异常
- JAVA进阶2.3——用throws处理异常
- [Java 进阶]异常
- Python进阶08 异常处理
- 【Java 基础篇】【第九课】继承
- MySQL性能优化的最佳20+条经验
- 【Java 基础篇】【第十课】多态
- 【Java 进阶篇】【第一课】String类
- What is the best way to calculate a checksum for a file that is on my machine?
- 【Java 进阶篇】【第二课】异常处理
- java实现:打印前n个质数
- 【Android开发学习笔记】【第六课】Activity的生命周期-下
- 【Android开发学习笔记】【第七课】五大布局-上
- 【Android开发学习笔记】【第八课】五大布局-下
- 【Android开发学习笔记】【第九课】重力感应
- 【Android开发学习笔记】【第十课】运动事件 之——触摸屏
- 【Android开发学习笔记】【随笔】UI线程
- 【Android测试】【随笔】在手机里用命令行创建中文文件夹