[Java 进阶]异常
世上没有百分之百完美的程序。程序总难免存在各式各样的问题。所以,程序中添加对于错误的处理机制是十分有必要的。这就好比人多的公共场所需要有防火防盗的安保系统一个道理。
捕获异常
异常处理格式
try {
// 有可能出现异常的语句
} catch (Type1 e1) {
// 异常类型1处理代码
} catch (Type2 e2) {
// 异常类型2处理代码
}
// etc...
catch (TypeN en) {
// 异常类型n处理代码
} finally {
// 不管有没有发生异常,finally语句块都会被执行
// 在 try...catch 异常处理机制中, finally关键字是可选的
}
try 关键字之后的程序块就是异常的监控区域。
多个 catch 关键字后面的程序块,则是针对每个要捕获的异常,所准备的相应处理程序。
finally 关键字之后的程序块,无论是否出现异常,总会被执行。 finally 关键字在 try...catch 机制中并不是必须的。
public static void main(String args[]) {
System.out.println("********** 计算开始 ***********");
int i = 10;
int j = 0;
try {
int temp = i / j; // 此处产生了异常
System.out.println("两个数字相除的结果:" + temp);
System.out.println("****************************");
} catch (ArithmeticException e) {
System.out.println("出现异常了:" + e);
} finally {
System.out.println("对与不对,我都在这里,不偏不移");
}
System.out.println("********** 计算结束 ***********");
}
};
范例代码
自定义异常
JAVA虽然提供了大量的异常类,但也不可能预见所有的异常情况。所以可以自己定义异常类来表示程序可能会遇到的特定问题。
要自定义异常类,必须从已有的异常类继承,最好选择功能相近的异常类继承。
// 自定义异常类,继承Exception类
class MyException extends Exception {
public MyException(String msg) {
super(msg); // 调用Exception类中有一个参数的构造方法,传递错误信息
}
};
public class DefaultException {
public static void main(String args[]) {
try {
throw new MyException("自定义异常。"); // 抛出异常
} catch (Exception e) {
e.printStackTrace();
}
} /* Output:
MyException: 自定义异常。
at DefaultException.main(DefaultException.java:11)
*/
}
抛出异常
在定义一个方法时可以使用 throws 关键字声明,使用 throws 声明的方法表示此方法不处理异常,而交给方法的调用处进行处理。
public 返回值类型 方法名称(参数列表...) throws 异常类{}
需要注意的是,如果异常类类型不是运行时异常类型,那么在调用这个方法时,不管是否有问题,都必须使用 try...catch 进行异常的捕获与处理。
// 定义除法操作,如果有异常,则交给被调用处处理
public int div(int i, int j) throws Exception {
int temp = i / j;
return temp;
}
};
public class ThrowsDemo01 {
public static void main(String args[]) {
Div div = new Div();
// div.div(10, 0); // 如果不使用 try...catch 结构,编译器会认为出错
try {
System.out.println("除法操作:" + div.div(10, 0));
} catch (Exception e) {
e.printStackTrace(); // 打印异常
}
}
};
范例代码
和 throws 不同,throw 关键字表示主动地抛出一个异常,抛出时直接抛出异常类的实例化对象即可。
public static void main(String args[]){
try{
throw new Exception("自己抛着玩的。") ; // 抛出异常的实例化对象
}catch(Exception e){
System.out.println(e) ;
}
}
};
范例代码
异常的类型
JAVA中所有的异常类都继承自 Throwable 类。
异常可分为两大类:Exception 和 Error。
Exception:一般指的是程序中出现的问题,可以通过 try...catch 处理。
Error:一般指的是JVM错误,程序无法处理。
Exception还可以再继续细分为运行时异常(RuntimeException)和非运行时异常。
运行时异常可以不使用 try...catch 进行处理。
请看以下代码:
public class RuntimeExceptionDemo01 {
public static void main(String args[]) {
int result = 0;
String str = "10";
String str2 = "abc";
result = Integer.parseInt(str); // 将字符串中的数字转为int类型
System.out.println(result * result);
result = Integer.parseInt(str2); // 试图将字符串中字母转为int类型时会出现异常
System.out.println(result * result);
}
};
执行以上代码时,再第二次调用Integer.parseIn()时会出现异常。我们看一下这个方法的定义:
public static int parseInt(String s) throws NumberFormatException
这里使用了 throws 关键字,但是在实际调用时并没有使用 try...catch,编译器也没有报错。
这是因为所有继承自 RuntimeException 的类都可以不使用 try...catch 进行处理。在这种情况下,如果产生异常,将由 JVM 进行处理,此时肯定会中断程序。
所以,如果想要程序在出错时仍可以继续执行,最好还是使用 try...catch 的异常处理机制来处理。
参考资料
Java 编程思想
JAVA 开发实战宝典
[Java 进阶]异常的更多相关文章
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- Java进阶03 IO基础
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/11/3000905.html 作者:Vamei 出处:http://www.cnblogs.com ...
- 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)
本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...
- Java进阶(四十七)Socket通信
Java进阶(四十七)Socket通信 今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...
- Java进阶(四十三)线程与进程的区别
Java进阶(四十三)线程与进程的区别 1.线程的基本概念 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必 ...
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...
- Java进阶之路
Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...
- Java 进阶6 异常处理的陷阱
Java 进阶6 异常处理的陷阱 20131113 异常处理机制是 Java语言的特色之一,尤其是 Java的Checked 异常,更是体现了 Java语言的严谨性:没有完善的错误的代码根本就不会被执 ...
- Java进阶2 数组内存和对象的内存管理知识
Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...
随机推荐
- Silverlight5中横向显示ListBox
备忘 <ListBox x:Name="Cpbrow" HorizontalAlignment="Left" Height="153" ...
- 【菜鸟玩Linux开发】在C++里操作MySQL
MySQL是一个的开源关系型数据库,对于服务端开发来说是一个优秀的选择.本篇内容将介绍如何在C++程序里操作MySQL数据库. ———————————————————————————————————— ...
- 人人都是 DBA(IV)SQL Server 内存管理
SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...
- CSS控制样式的三种方式优先级对比验证
入职已经一个月了,自此后,就好久没有写过博客了,在此先跟关注我的博友们说声抱歉.今天,在公司的一个培训作业的驱动以及伟哥那句“再不写博客就开除你”的监督下,我终于重拾旧爱,再次登录博客园,继续与大家分 ...
- 浅析SQL Server实现分布式事务的两阶段提交协议2PC
不久之前团队有个新人问我一个很重要的web服务接口如何保证事务的问题.因为涉及到跨库事务,当时我只是回答目前我们的SOA框架都不支持跨库事务.然后就问到了数据库跨库事务是如何实现的,我只能凭印象含糊回 ...
- MySQL—FOREIGN KEY
作用:保持数据一致性,完整性.实现一对一或一对多关系.(学习的过程中,老师说,实际的生产中,一般不使用物理上的外键约束的,都是使用逻辑上的外键约束) 要求: 父表与子表的存储引擎必须相等,而且只能是I ...
- springmvc下实现登录验证码功能
总体思路,简单讲,就是后台生成图片同时将图片信息保存在session,前端显示图片,输入验证码信息后提交表单到后台,取出存放在session里的验证码信息,与表单提交的验证码信息核对. 点击验证码图片 ...
- 这里有个坑---[NotMapped]不要忘了加
这里有个坑,我们定义实体的时候如果使用了在数据库没有的字段记得加[NotMapped]---------每一个遇到的坑总结后都是一比财富. 在项目中我们一般会使用EF等ORM框架来为我们服务,在ORM ...
- IoC组件Unity再续~根据类型字符串动态生产对象
回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...
- php将文件转换成二进制输出[转]
header( "Content-type: image/jpeg"); $PSize = filesize('1.jpg'); $picturedata = fread(fope ...