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. 牛客随笔(c++)

    1.关于指针的字节大小: 当为32位系统时大小为4字节,64位系统时大小为8字节: #include<iostream> using namespace std; int main() { ...

  2. 利用AMPScript获取Uber用户数据的访问权限

    现代项目开发和资产管理方法正在不停地快速变化.在这场创新和扩张的竞赛中,新资产被迅速部署并暴露于公共互联网,已有资产也在不断发展. 要跟上这个不断变化的攻击面是很难的,更不用说保护这些应用程序和系统了 ...

  3. UML与软件建模:第一次作业(UML用例图绘制)

    uml第一次作业: 用例图是什么? 用例图我感觉就是把网站中各个用户的动作分解一下,再用rational rose软件把图画出来. 画例图主要分为三个步骤:a 确定系统角色  b 确定用例  c 对用 ...

  4. javascript将base64编码的图片数据转换为file并提交

    /** @param base64Codes 图片的base64编码 */ function sumitImageFile(base64Codes){ var form=document.forms[ ...

  5. Mybatis的updateByExampleSelective方法

    好久没些项目,一些基础框架的功能都忘记了,慢慢边做边回忆,果然自己是三流的(某个大佬说过三流的程序员看CSDN和博客) API:可以只更新传入的参数 updateByExampleSelective( ...

  6. Click One客户端安装后将安装目录删除,再从服务器下载安装无法安装解决办法

    报错信息: 平台版本信息 Windows : 6.1.7601.65536 (Win32NT) Common Language Runtime : 4.0.30319.42000 System.Dep ...

  7. 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups)VALUES('1','hh','hh@163.com','Boss')' at line 1

    mysql8.0版本 在已存在的表里插入一条数据 insert INTO api_user(id,username,email,groups)VALUES('1','hh','hh@163.com', ...

  8. javascript----数组的方法

    1---join() //1----->join()方法将数组中所有元素都转化<<字符串>> //并连接在一起 //array.join()方法是string.split ...

  9. java导出csv格式文件

    导出csv格式文件的本质是导出以逗号为分隔的文本数据 import java.io.BufferedWriter; import java.io.File; import java.io.FileIn ...

  10. 解决jmeter中文乱码的三种方法

    1.在Jmeter中的Http请求中,在内容编码后填入“utf-8”. 2.在本地文件存储Jmeter的bin目录下,修改jmeter.properties文件. (1)用记事本打开jmeter.pr ...