java异常处理try catch finally
1 异常
1.1 异常处理的作用
在编程时,如果出现文件打开失败,读写文件就会异常退出。如果出现内存溢出错误,程序也会异常退出。如果不能对这些异常进行处理。程序则无法正常运行。所以java提供了一种异常处理机制,能够捕获这些异常,并能够进行处理。避免程序异常退出,保持程序的健壮性。异常处理还可以将主逻辑代码和异常处理代码分开,提高了程序的可阅读性,使得更加清晰分明。
1.2 异常的声明thows
在定义一个方法时,方法内部可能出现什么样的异常需要在方法定义时进行声明。使用thows关键字声明。多个用逗号隔开。声明之后,调用该方法时,一定要实现处理该异常的代码,否则程序会报错。
public Scanner(File source) throws FileNotFoundException, IOException;
1.3 异常处理try{} catch{} finally{}
Try内部存放主要的逻辑代码,catch用于分类处理各种异常,如果没有匹配的catch异常类型,异常就会在调用栈中传给该方法的调用者,当前的方法会执行finally块并且退出调用栈。无论异常是否发生,finally代码块都会执行,除非JVM遇到了严重的错误或者在catch块中执行了System.exit()方法。finally代码块用来清理资源。
try
{
// Main logic here
Scanner in = new Scanner(new File("test.in"));
}
catch (FileNotFoundException ex)
{ // Exception handlers below
// Exception handler for "file not found"
} catch (IOException ex)
{
// Exception handler for "IO errors"
} finally
{
close file; // always try to close the file
}
1.4 异常处理传递
1.4.1 方法调用堆栈
在方法A中调用了方法B,异常处理的传递顺序也是按照方法调用堆栈的顺序去传递的。
public class MethodCallStackDemo {
public static void main(String[] args) {
System.out.println("Enter main()");
methodA();
System.out.println("Exit main()");
public static void methodA(){
System.out.println("Enter methodA()");
methodB();
System.out.println("Exit methodA()");
}
public static void methodB(){
System.out.println("Enter methodB()");
System.out.println("Exit methodB()");
}
}
调用方法有一个方法调用方法堆栈,main方法先入栈执行,然后是方法A入栈执行,然后是方法B入栈执行,方法B执行结束后出栈,方法A执行结束出栈,方法main执行结束出栈。调用方法堆栈符合先进后出的原则。所以调用正常打印结果是
Enter main()
Enter methodA()
Enter methodB()
Exit methodB()
Exit methodA()
Exit main()
如果在调用方法B的时候出现异常,异常之后的主逻辑代码就不会被执行,所以不会打印Exit。异常发生后,方法B、方法A和方法main就会立刻出栈,不会正常执行,没有打印Exit。打印结果如下
Enter main()
Enter methodA()
Enter methodB()
1.4.2 异常传递实现
在方法A中调用了方法B,如果希望在调用方法B时产生的异常能够传递给方法A,也就是说在调用方法A的地方去处理方法B中可能会出现的异常。这样就需要将异常传递到上一级。但是需要传递的方法都声明了异常才可以。如果没有声明,jvm找不到异常处理者,程序还是会退出。
public class MethodCallStackDemo {
public static void main(String[] args) {
System.out.println("Enter main()");
try
{
methodA();
} catch(IOException ioe)
{
}
}
System.out.println("Exit main()");
public static void methodA() throws IOException {
System.out.println("Enter methodA()");
methodB();
System.out.println("Exit methodA()");
}
public static void methodB() throws IOException {
System.out.println("Enter methodB()");
System.out.println("Exit methodB()");
}
}
当方法B中出现一个异常,这个方法会创建一个Exception对象,并且传递这个Exception对象到JVM,Exception对象包含了异常的类型以及异常发生时程序的状态,JVM的责任就是寻找处理这个Exception对象的异常处理者,它在调用栈中不断的向后搜索直到找到一个匹配的异常处理者来处理这个Exception对象,methodB()、methodA()被遍历到了,只是它们没有对异常处理,所以它们的方法会声明一个throws XxxException。main有一个XxxException处理者,并且会将这个异常对象传递给这个异常处理者者。如果JVM在方法栈的所有方法中没有找到一个匹配的异常处理者,它就会终止程序。
总之,如果出现异常,就需要从内向外搜索异常处理者, 找到后进行处理。如果没有找到,或者没有声明异常而导致异常传递终止,就会退出程序。
1.5 抛出异常
当一个Java操作遇到一个异常,出现错误的语句可以自行创建一个指定的Exception对象并且通过throw XxxException语句将它抛给JVM。
例如:
public void methodD() throws XxxException, YyyException { // method's signature
// XxxException occurs
if ( ... )
throw new XxxException(...); // construct an XxxException object and throw to JVM
1.6 常用异常类
(1)ArrayIndexOutOfBoundsException:如果访问的数组索引超出了数组的限制,就会被JVM抛出。
int[] anArray = new int[3];
System.out.println(anArray[3]);
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
(2)NullPointerException:当代码尝试使用一个对象的空引用的时候,就会被JVM抛出。
String[] strs = new String[3];
System.out.println(strs[0].length());
Exception in thread "main" java.lang.NullPointerException
(3)NumberFormatException: 当尝试将一个字符串转换为一个数字类型,但是字符串没有合适的转换方法。
Integer.parseInt("abc");
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
(4)ClassCastException: 当对象类型转换失败的时候,就会被JVM抛出。
Object o = new Object();
Integer i = (Integer)o;
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Integer
(5)IllegalArgumentException:当一个方法接受到一个非法或者不合适的参数的时候就会抛出,我们可以在自己的代码中重用这个异常。
(6)IllegalStateException: 最典型的例子就是当可能某个方法只允许调用一次,但是被尝试多次调用,也就是当某个方法被调用,但是当前程序对于这个任务的执行并不在一个合适的状态下,就会抛出这个异常。
(7)NoClassDefFoundError: 当某个定义的类没有被找到,就会被抛出。在JDK 1.7之前,如果你尝试访问一个不存在的类,就会看到看到这个异常调用栈信息,在JDK 1.7之后,就只会打印简要的错误信息:"Error: Could not find or load main class xxx"。
1.7 自定义异常类
可以通过扩展Exception或者它的子类来创建自己的异常类。
public class MyMagicException extends Exception {
public MyMagicException(String message) { //constructor
super(message);
}
}
在异常条件满足时,通过thow抛出异常。
public class MyMagicExceptionTest {
// This method "throw MyMagicException" in its body.
// MyMagicException is checked and need to be declared in the method's signature
public static void magic(int number) throws MyMagicException {
if (number == 8) {
throw (new MyMagicException("you hit the magic number"));
}
System.out.println("hello"); // skip if exception triggered
}
java异常处理try catch finally的更多相关文章
- Java 异常处理 try catch finally throws throw 的使用和解读(一)
//最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...
- java 异常处理try+catch
在整个异常处理机制中,异常在系统中进行传递,传递到程序员认为合适的位置,就捕获到该异常,然后进行逻辑处理,使得项目不会因为出现异常而崩溃.为了捕获异常并对异常进行处理,使用的捕获异常以及处理的语法格式 ...
- java异常处理之throw, throws,try和catch
转自 http://blog.csdn.net/zhouyong80/article/details/1907799 程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...
- “崩溃了?不可能,我全 Catch 住了” | Java 异常处理
前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeEx ...
- Java中的异常处理try catch(第八周课堂示例总结)
异常处理 使用Java异常处理机制: 把可能会发生错误的代码放进try语句块中. 当程序检测到出现了一个错误时会抛出一个异常对象. 异常处理代码会捕获并处理这个错误. catch语句块中的代码用于处理 ...
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...
- java异常处理(父子异常的处理)
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...
- Java 异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
随机推荐
- 压力(性能)测试及jmeter的使用
github中标注lab3的文档记录了我的详细的实验过程,有关环境搭建.过程理解.实验结果与遇到的问题等,希望可以帮到初学者. 欢迎交流- https://github.com/fogmisty/So ...
- WC.exe【C】
gitee传送门!!!(电脑打不开github,多次尝试未果,决定先用gitee存着先) 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序 ...
- python爬取指定新闻
作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2894 给定一篇新闻的链接newsUrl,获取该新闻的全部信息 标题 ...
- 转--Python re模块 验证11位手机号
一.常用正则表达式符号和语法: '.' 匹配所有字符串,除\n以外 ‘-’ 表示范围[0-9] '*' 匹配前面的子表达式零次或多次.要匹配 * 字符,请使用 \*. '+' 匹配前面的子表达 ...
- GO map
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 语法:map[KeyType]ValueType KeyType:表示键的类型. V ...
- MySQL复制表-CREATE SELECT
假设存在以下Table: mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+-- ...
- Axure RP 9 Mac正式汉化版安装教程
Axure RP9 汉化版是mac平台上一款交互式原型设计神器,是专为UX专业人员和业务分析师设计的专业网站原型设计工具!可以帮助他们快速创建应用程序和网站的线框,原型和规格!新功能包括一系列广泛的改 ...
- xlrd & xlwd
一.安装xlrd http://pypi.python.org/pypi/xlrd 二.使用介绍 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open ...
- 设计的一些kubernetes面试题目
这几个月参与了几场面试,设计了多道面试题,觉得可以综合考察应聘人对kubernetes的掌握情况.在这里分享下,供应聘人自查以及其他面试官参考. 这些面试题的设计初衷并不是考察kubernetes的使 ...
- NOIP 2017 宝藏 - 动态规划
题目传送门 传送门 题目大意 (家喻户晓的题目不需要题目大意) 设$f_{d, s}$表示当前树的深度为$d$,与第一个打通的点连通的点集为$s$. 每次转移的时候不考虑实际的深度,深度都当做$d$, ...