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的更多相关文章

  1. Java 异常处理 try catch finally throws throw 的使用和解读(一)

    //最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...

  2. java 异常处理try+catch

    在整个异常处理机制中,异常在系统中进行传递,传递到程序员认为合适的位置,就捕获到该异常,然后进行逻辑处理,使得项目不会因为出现异常而崩溃.为了捕获异常并对异常进行处理,使用的捕获异常以及处理的语法格式 ...

  3. java异常处理之throw, throws,try和catch

    转自 http://blog.csdn.net/zhouyong80/article/details/1907799  程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...

  4. “崩溃了?不可能,我全 Catch 住了” | Java 异常处理

    前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeEx ...

  5. Java中的异常处理try catch(第八周课堂示例总结)

    异常处理 使用Java异常处理机制: 把可能会发生错误的代码放进try语句块中. 当程序检测到出现了一个错误时会抛出一个异常对象. 异常处理代码会捕获并处理这个错误. catch语句块中的代码用于处理 ...

  6. 札记:Java异常处理

    异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...

  7. java异常处理(父子异常的处理)

    我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...

  8. Java 异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...

  9. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

随机推荐

  1. 安卓系统广播暴露设备信息-Android System Broadcasts Expose Device Information

    Android device details are being exposed to running applications via Wi-Fi broadcasts in the mobile ...

  2. 算法题:int 数组中 只有一个是id 只出现一次 其他都出现2次 怎么找出只出现一次的id

    首先讲一个最笨的算法:时间复杂度为N  空间复杂度为N 代码如下:输出结果id=3完全正确: int[] a = new int[] { 1, 1, 2, 2, 3, 4, 4 }; Dictiona ...

  3. Oracle 10g RAC OCR、Voting disk更换

    环境:OEL 5.7 + Oracle 10.2.0.5 RAC 需求:更换存储,OCR.Voting disk同时需要更换到新存储. 1.替换OCR 2.替换voting disk 1.替换OCR ...

  4. windows程序设计 获取磁盘容量

    //磁盘分区的总容量(字节)=总簇数*每簇扇区数*每扇区字节数 //磁盘分区的空闲空间(字节)=空闲簇数*每簇扇区数*每扇区字节数 BOOL GetDiskFreeSpace( LPCTSTR lpR ...

  5. (转载记录)Active Directory 灾难恢复

    部分适用于Windows Server 2003. 在IT环境中谁也不能保证软硬件永远没有故障:那么就需要我们IT能够未雨绸缪,尽量避免故障发生,如果故障发生了,我们需要把损失降到最小:那么就需要我们 ...

  6. QQ/微信中被禁止访问的网页怎么打开

    为什么关心这种技术?因为我经常听到身边搞微商.搞微信项目的朋友都在叫苦连天,由于微信域名屏蔽.微信域名被拦截.弄得他们尸横遍野,损失的连过年回家的路费都没了,曾经的叱咤风云一下变成了今日的倒亏损.腾讯 ...

  7. Angular4 组件生命周期

  8. Entity framework 绑定到Datagridview的添加删除修改

    Entity framework 绑定到Datagridview的添加删除修改 using System; using System.Collections.Generic; using System ...

  9. 孙子兵法的计是最早的SWOT分析,《孙子兵法》首先不是战法,而是不战之法。首先不是战胜之法,而是不败之法

    孙子兵法的计是最早的SWOT分析,<孙子兵法>首先不是战法,而是不战之法.首先不是战胜之法,而是不败之法 在打仗之前,你要详细地去算. 计算的目的是什么呢?孙子说,是为了知胜,就是为了知道 ...

  10. 【winform】serialPort 串口

    一. 1.串口通信简单实现 该来的总会来的,学做硬件的,串口这个东西必须得门清. 俗话说的好,不会做串口助手的电子工程师不是好程序员.