【Java 进阶篇】【第二课】异常处理
概念
异常处理的存在是为了:
允许程序员跳过无法处理的问题,继续开发后续的工作,或根据异常做出更加聪明的处理方式。
Java中存在一类对象叫“异常对象”。
当异常情况发生时,就会暗战预先的设定,抛出(throw) 代表当前状况的对象;抛出其实就是一种特殊的返回方式,该线程会暂停,逐层退出调用,直到遇到异常处理器(Exception Handler)。
异常处理器可以捕捉(catch)的异常对象,然后根据对象来决定下一步是提醒用户、处理一次还是退出程序等等..
基本结构
异常处理器由 try, catch, finally(这个可以没有) 以及随后的程序块组成 :
try
{
...;
} catch()
{
...;
} catch()
{
...;
} finally
{
...;
}
异常处理器 监视try后面的程序块,catch的括号中需要有一个参数,用来代表索要捕捉的异常的类型。catch会捕捉相应的类型和它的派生类。
try所监视的程序库可能抛出不止一种类型的异常,所以一个异常处理器可以有多个catch模块。
finally后面的程序块,无论是否发生异常,都会被执行。
我们在try中放入可能出错,需要监视的程序,在catch中设计应对异常的方案。
简单例子
public class two
{
public two() throws IOException
{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try
{
StringBuilder sb = new StringBuilder();
String line = br.readLine(); while (line != null)
{
sb.append(line);
sb.append("\n");
line = br.readLine();
}
String everything = sb.toString();
}
catch (IOException e)
{
e.printStackTrace();
System.out.println("IO problem");
}
finally
{
br.close();
}
}
}
第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环境之外的,并不是程序员所能控制的。如果程序员可以预期异常,可以利用异常处理机制来制定应对预案。比如文件出问题时,提醒系统管理员。再比如在网络服务器出现问题时,提醒用户,并等待网络服务器恢复。
异常处理机制主要是用于处理这样的异常。
异常处理例子
public class two
{
public static void main(String[] args)
{
Battery aBattery = new Battery(2);
aBattery.useBattery(-2.5);
}
} class Battery
{
private double power = 0.0; // percentage of battery
Battery(double p)
{
power = p;
} public boolean useBattery(double p)
{
try
{
test(p);
}
catch (Exception e)
{
System.out.println("catch Exception");
System.out.println(e.getMessage());
p = 0.0;
} if (this.power >= p)
{
this.power = this.power - p;
return true;
}
else
{
this.power = 0.0;
return false;
}
} private void test(double p) throws Exception
{
if (p < 0) {
Exception e = new Exception("p must be positive");
throw e;
}
}
}
运行结果为:
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
好啦,全部完啦
我再把源代码贴一次吧
public class two
{
public static void main(String[] args)
{
Battery aBattery = new Battery(2);
aBattery.useBattery(-2.5);
}
} class Battery
{
private double power = 0.0; // percentage of battery
Battery(double p)
{
power = p;
} public boolean useBattery(double p)
{
try
{
test(p);
}
catch (Exception e)
{
System.out.println("catch Exception");
System.out.println(e.getMessage());
p = 0.0;
} if (this.power >= p)
{
this.power = this.power - p;
return true;
}
else
{
this.power = 0.0;
return false;
}
} private void test(double p) throws BatteryUsageException
{
if (p < 0)
{
BatteryUsageException e = new BatteryUsageException("p must be positive");
throw e;
}
}
} class BatteryUsageException extends Exception
{
public BatteryUsageException() {}
public BatteryUsageException( String msg)
{
super(msg);
System.out.println("this is BatteryUsageException");
}
}
【Java 进阶篇】【第二课】异常处理的更多相关文章
- Java进阶篇(六)——Swing程序设计(上)
Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...
- Java进阶篇(六)——Swing程序设计(下)
三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...
- Java进阶篇(一)——接口、继承与多态
前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等. 本篇的主题是接口.继承与多态, ...
- Java进阶篇(四)——Java异常处理
程序中总是存在着各种问题,为了使在程序执行过程中能正常运行,使用Java提供的异常处理机制捕获可能发生的异常,对异常进行处理并使程序能正常运行.这就是Java的异常处理. 一.可捕获的异常 Java中 ...
- 【Java 进阶篇】【第一课】String类
引用 String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String ...
- Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)
前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- Java进阶篇(五)——Java的I/O技术
程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...
- Java进阶篇 设计模式之十四 ----- 总结篇
前言 本篇是讲述之前学习设计模式的一个总结篇,其目的是为了对这些设计模式的进行一个提炼总结,能够通过查看看此篇就可以理解一些设计模式的核心思想. 设计模式简介 什么是设计模式 设计模式是一套被反复使用 ...
随机推荐
- 简单几何(线段覆盖) POJ 3347 Kadj Squares
题目传送门 题意:告诉每个矩形的边长,它们是紧贴着的,问从上往下看,有几个还能看到. 分析:用网上猥琐的方法,将边长看成左端点到中心的距离,这样可以避免精度问题.然后先求出每个矩形的左右端点,然后如果 ...
- BZOJ3780 : 数字统计
从低位到高位数位DP,f[i][j][k]表示已经填了后i位,转化的数字为j,后i位与x后i位的大小关系为k的方案数. #include<cstdio> const int N=202,B ...
- Codeforces Round #195 (Div. 2) D题Vasily the Bear and Beautiful Strings
这场CF,脑子乱死啊...C题,搞了很长时间,结束了,才想到怎么做.B题,没看,D题,今天看了一下,很不错的组合题. 如果n和m都挺多的时候 以下情况都是变为1,根据偶数个0,最后将会为1,奇数个0, ...
- HDU 4647 Another Graph Game(贪心)
题目链接 思路题.看的题解. #include <cstdio> #include <string> #include <cstring> #include < ...
- Java_BigDecimal类型比较大小
这个类是java里精确计算的类 1 比较对象是否相等 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); ...
- linux中shell变量$#,$@,$*,$?,$$,$!,$_,$0,$1,$2的含义解释
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) ...
- 你能不用计算机来计算S=a+(a+1)+(a+2) + ...... + b的解的数目吗?
S=a + (a + 1) + (a + 2) + ...... + b(其中a, b > 0) 现在我们要求,给定一个正整数S,求有多少种不同的<a,b>,使得上述的等式成立. 这 ...
- python 面向对象的三大特征之 继承
#继承 #object 基类,是python定义的所有类的父类 #经典类:不继承object的类称作经典类 #新式类:继承object的类称作新式类 #python 3.x统一为新式类 #经典类是类对 ...
- IOS 今天学到太多的知识了,赶快记录下来
TabBarController 修改tabbar的背景颜色和选中时候的颜色: func application(application: UIApplication, didFinishLaunch ...
- HTML5 挖宝
http://geek.csdn.net/news/detail/91536 http://mozilla.com.cn/thread-360325-1-1.html