• Java异常(Exception)


    Java异常:运行期出现的错误

    1. Java异常是Java提供的用于处理程序中错误的一种机制;

    2. 错误指的是程序运行期间发生的异常事件,如除零溢出、数组下标越界、读取的文件不存在....

    3. Java程序的执行过程中如出现异常事件,会生成一个异常类对象,该异常对象封装了异常事件的信息并将其提交给Java运行时系统,此过程称之为抛出异常(throw exception);

    4. 当Java运行时系统接收到异常对象后,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,此过程称之为捕获异常(catch exception);

    5. 异常的分类:J2SDK中定义了很多异常类,这些异常类对应了各种各样可能出现的异常事件,如下图

                         

             ① Error:称为错误(系统错误),你处理不了,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理.

             ② Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示声明或捕获.

             ③RuntimeException:一类特殊的异常,如被0除、数组下标越界,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行的效率影响很大。因此由系                                         统自动检测并将他们交给缺省的异常处理程序(用户可不比对其处理).

    6. try语句

        ① try{...} 语句指定了一段代码,该段代码就是一次捕获并处理例外的范围;

        ② 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常作相应的处理;

        ③ 如果没有例外产生,所有的catch代码都被忽略,不执行.

    7. catch语句

        ① 在catch语句块中是对异常进行处理的代码,每个try语句可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象;

        ② 在catch中声明的异常对象(catch(someException e))封装了异常事件发生的信息,在Catch语句块中可以使用这个对象的一些方法获取这些信息.

        ③  getMessage()方法,用来得到有关异常事件的信息;

             printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容;

                   一般而言,printStackTrace()方法用得比较多,它包含了getMessage()方法的内容,跟踪异常:如果一段代码可能发生异常是由于另外一段代码异常引起的,则它会打            印两段代码的异常信息,以及出错位置.

    8. finally语句

         ①  finally语句为异常处理提供了一个统一的出口,使得在控制流程转到程序的其它部分以前,能够对程序的状态做统一的管理;

         ②  无论try语句指定的程序块中是否抛出异常,finally所指定的代码都要被执行;

         ③  通常在finally语句中进行资源的清除工作,如:关闭打开的文件、删除临时文件、释放非内存资源;

    9. 除了在测试之外,在你实际当中编程的时候,在main方法中抛出Exception是相当不好的编程习惯,应该写try,catch作相应的处理;

    10. 在一个try语句块中,父类异常的捕获语句不可以写在子类异常的捕获的上面,否则会覆盖子类的异常;

    11. 使用自定义异常:

          其中,自定义异常的步骤如下:

                 ① 通过继承 java.lang.Exception类声明自己定义的异常;

                 ② 在方法适当的位置,生成自定义异常的实例,并用 throw 语句抛出;

                 ③ 在方法的声明部分用 throws 语句声明该方法可能抛出异常.

          如 Demo_3 所示.

    12.  Demo

         Demo_1

    import java.io.*;
    public class TestEx {
    	public static void main(String[] args){
    		FileInputStream in = null;
    		int b;
    		try {
    			in = new FileInputStream("myfile.txt");
    			b = in.read();
    			while(b != -1){
    				System.err.println((char)b);
    				b = in.read();
    			}
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally{
    			try {
    				in.close();
    				System.out.println("hello");
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }

         Demo_2

    import java.io.*;
    public class TestEx {
    	void m(int i) throws ArithmeticException{
    		if(i==0){
    			throw new ArithmeticException("被除数为0"); 
    		}
    	}
    	void f() throws FileNotFoundException, IOException {
    		FileInputStream in = new FileInputStream("myfile.txt");
    	    int b;
    	    b = in.read();
    	    while(b != -1){
    	    	System.out.println((char)b);
    	    	b = in.read();
    	    }
    	}
    	void g() throws Exception {
    		f();
    	}
    	public static void main(String[] args){
    		try {
    			new TestEx().g();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

     Demo_3

    class MyException extends Exception {
    	private int id;
    	public MyException(String message, int id) {
    		super(message);
    		this.id = id;
    	}
    	public int getId(){
    		return id;
    	}
    }
    
    public class TestEx {
    	public void regist(int num) throws MyException{
    		if(num<0){
    			throw new MyException("人数为负值,不合理",3); //regist方法在这个地方抛出异常后,这个方法就不会继续往下执行了
    		}
    		System.out.println("登记人数: "+num);
    	}
    	public void manager(){
    		try {
    			regist(100);
    //			regist(-1);
    		} catch (MyException e) {
    			System.out.println("登记失败,出错类型:"+e.getId());
    			e.printStackTrace();
    		}
    		System.out.println("操作结束");
    	}
    	public static void main(String[] args){
    		TestEx te = new TestEx();
    		te.manager();
    	}
    }
    

     regist(100)的运行结果:登记人数: 100
                                      操作结束

     regist(-1)的运行结果:登记失败,出错类型: 3
                                    操作结束
                                    MyException: 人数为负值,不合理
                                            at TestEx.regist(TestEx.java:15)
                                            at TestEx.manager(TestEx.java:22)
                                            at TestEx.main(TestEx.java:31)

    13.  异常与继承之间的关系

           在继承后,重写方法需要抛出与原来异常类型一致异常或不抛出异常.

    class A{
    	public void method() throws IOException{}
    }
    class B1 extends A{  // 错误
    	public void method() throws FileNotFoudException{}
    }
    class B3 extends A{ // 正确
    	public void method(){}
    }
    class B4 extends A{ // 错误
    	public void method(){} throws IOException, MyException{}
    }
    

         

  • 相关阅读:
    (转)实战Memcached缓存系统(4)Memcached的CAS协议
    (转)实战Memcached缓存系统(3)Memcached配置参数初解
    (转)实战Memcached缓存系统(2)Memcached Java API基础之MemcachedClient
    (转)实战Memcached缓存系统(1)Memcached基础及示例程序
    杨澜:你唯一有把握的是成长
    谈谈秒杀系统的落地方案
    【前端】仿消息推送到App提示
    【前端】你想通过选择一个前端框架来实现什么?
    Web应用中解决问题的方案步骤?
    前端技术
  • 原文地址:https://www.cnblogs.com/bosongokay/p/6747324.html
Copyright © 2020-2023  润新知