所谓异常就是程序运行时可能出现的一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。

各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系。

异常对象可以调用如下方法得到或输出有关异常的信息。

public String getMessage();

public void printStackTrace();

public String toString();

java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分立刻结束执行,转向执行相应的catch部分。代码展示如下所示:

public class Exception {

    public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 0, m = 0, t = 1000;
try{
m = Integer.parseInt("8888");
n = Integer.parseInt("ab89");
t = 7777;//这后面的语句没有机会被执行
}
catch(NumberFormatException e){
System.out.println("发生异常" + e.getMessage());
}
System.out.println("n=" + n + ", m="+ m + ",t=" + t); try{
System.out.println("故意抛出I/O异常!");
throw new java.io.IOException("我是故意的");//故意抛出异常,throw是用来指出要抛出哪个异常的
}
catch(java.io.IOException e){
System.out.println("发生异常 " + e.getMessage());
}
}
}

结果如下:

自定义异常类

throw关键字的作用是抛出指定的异常,而throws是方法在声明时可以用来要产生的异常,表示这个方法可能抛出这个指定的异常。

展示结果如下

BankException.java

public class BankException extends Exception {
String message;
public BankException(int m, int n){
message = "入账资金" + m + "是负数或指出" + n + "是正数,不符合系统要求.";
}
public String warnMess()
{
return message;
}
}

Bank.java

public class Bank {
private int money;
public void income(int in, int out)throws BankException
{
if(in <= 0 || out >= 0 || in + out <= 0)
{
throw new BankException(in, out);
}
int netIncome = in + out;
System.out.printf("本次计算出的纯收入是:%d\n", netIncome);
money = money + netIncome;
}
public int getMoney()
{
return money;
}
}

 Test01.java

public class Test01 {

	public static void main(String[] args) {
// TODO Auto-generated method stub
Bank bank = new Bank();
try{
bank.income(200, -100);
bank.income(300, -100);
bank.income(400, -100);
System.out.printf("银行目前有%d元\n", bank.getMoney());
bank.income(200, 100);
bank.income(999, -100);
} catch (BankException e) {
// TODO Auto-generated catch block
System.out.println("计算收益的过程出现如下问题:");
System.out.println(e.warnMess());
}
System.out.printf("银行目前有%d元\n",bank.getMoney());
} }

 运行结果如下所示:

断言语句在调试代码阶段非常有用,当发送某个错误时,要求程序必须立即停止执行,这时就可以使用断言。

assert number >= 0;

如果number>=0为true,程序继续执行,否则立刻结束执行。

try{}

catch(ExceptionSubClass e){}

finally{}

其执行机制是:在执行try-catch语句后,执行finally子语句,也就是说,无论在try部分是否发生过异常,finally语句都会被执行。但有两点需要强调:

(1)如果在try-catch语句中执行了return语句,那么finally自语句依然会被执行。

(2)try-catch语句中执行了程序退出代码,即执行了System.exit(0);,则不执行finally自语句(当然也包括其后的所有语句)。

review08的更多相关文章

随机推荐

  1. iOS响应超出View范围点击事件

    // 在view中重写以下方法,其中self.button就是那个希望被触发点击事件的按钮 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent ...

  2. Hibernate 框架入门(一)

    1. SSH Web 层: Struts2 业务层: Spring 持久层: Hibernate 2. Hibernate 概述 概述 Hibernate 是一个对象关系映射框架(ORM 框架); 对 ...

  3. MySQL中自增长与锁

    在InnoDB存储引擎中,对于每个含有自增长值的表都有一个自增长计数器(auto-increment counter)当对含有自增长的计数器的表进行插入操作时,这个计数器会被初始化,执行如下的语句可以 ...

  4. Java 线程控制(输出奇偶数)

    两个线程,一个输出1,3,5,7......99:另一个输出2,4,6,8......100. 1.线程同步 public class ST2 { int i = 0; public static v ...

  5. 笔画宽度变化(C++和matlab算法)

    最近一直在看工作方面的书籍,把论文的事情搁置了,之前承诺的贴代码的事一直拖.现在把代码整理发上来,只有核心部分的,都不是我写的,我是网上整理下载的,matlab代码的效果比较差. 全部文件网盘下载地址 ...

  6. 如何高效地分析Android_log中的问题?——查看Android源码

    在日常解bugs时,需要通过log日志来分析问题,例如查看crash发生时的堆栈信息时,就会有Android的源码的调用,这是就要去查看Android源码. 1.进入Android源码网址查看,例如  ...

  7. MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数

    用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...

  8. 前端 JavaScript&Dom

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  9. 【转】Linux rpm 安装卸载操作

    rpm 是红帽(RedHat)软件包管理工具,实现类似于 Windows 中的添加/删除程序功能.下面,就来向大家介绍 rpm 命令的用法. 1. 安装rpm包: rpm -ivh 软件包名 安装软件 ...

  10. 服务熔断、降级、限流、异步RPC -- HyStrix

    背景 伴随着业务复杂性的提高,系统的不断拆分,一个面向用户端的API,其内部的RPC调用层层嵌套,调用链条可能会非常长.这会造成以下几个问题: API接口可用性降低 引用Hystrix官方的一个例子, ...