A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小江哥 于 2019-4-19 14:16 编辑

异常:就是程序出现的不正常的情况。

举例:

异常:
错误:这是非常严重的问题,一般我们处理不了,一般在这里指的是硬件问题。
异常:
编译时期异常 开始就必须要处理的,如果不处理,后面就走不了。
运行时期异常 开始可以不用处理。这种问题一旦发生,就是我们的程序问题,需要我们修改程序。

体系结构:
Throwable:
Error:
Exception:
非RuntimeException:编译时期异常
RuntimeException:运行时期异常

异常演示:

除数不能为0
[Java] 纯文本查看 复制代码
package com.edu_01;
/**
 * 异常演示:
 * 除数不能为0 
 * 
 * java.lang.ArithmeticException: / by zero
 *      
 * 当我们的程序出现异常的时候我们的jvm虚拟机会给一个默认的处理方式:
 * 1.从出现异常的地方将程序停止掉
 * 2.将出现的异常类名,异常的原因,还有出现异常的位置全部打印到控制台
 * 
 * 你觉得jvm虚拟机给出的这种默认的处理方式好吗?
 * 答:不好,因为我们的程序是由多个部分组成,一旦一个部分出现了异长,
 * 我们不应该让 程序直接停止掉,应该让程序的其他模块继续正常运行,而针对这一个出现的异长给出一个
 * 具体的处理方案,这个处理方案最好不要影响到其他模块的程序执行
 *
 */
public class ExceptionDemo2 {
    public static void main(String[] args) {
        System.out.println("start");
        int a = 10;
        int b = 0;
        System.out.println(a/b);//java.lang.ArithmeticException: / by zero
        System.out.println("end");
    }

}

java.lang.ArithmeticException: / by zero

针对异常,JVM默认的处理方案:
一旦遇到程序出现了问题,就会把问题的类名,错误原因,错误的位置等信息打印在控制台,以便我们观察。
并且,会自动从当前出问题的地方停止掉。

这种处理方案虽然可以,但是不够好。
哪里不好呢?
其实程序出问题,不应该直接停止,因为我们的程序可能是由多部分组成的,
其中一个部分出问题了,不应该影响其他部分的执行。
所以,我们应该想办法让其他的部分能够执行下去。

1.2

我们是如何处理异常,保证各个部分不影响的呢?

两种方案:
A:try…catch…finally
B:throws

try…catch…finally:
try{
可能出现异常的代码
}catch(异常类名 变量名) {
针对异常的代码处理
}finally {
释放资源的地方
}

我们简化一下第一个:
try{
可能出现异常的代码
}catch(异常类名 变量名) {
针对异常的代码处理
}
代码演示:
[Java] 纯文本查看 复制代码
package com.edu_01;
/**
 *  * 我们是如何处理异常,保证各个部分不影响的呢?
 * 两种方案:
 *      A:try...catch...finally
 *      B:throws
 * 
 * try...catch...finally:
 *      try{
 *          可能出现异常的代码
 *      }catch(异常类名 变量名) {
 *          针对异常的代码处理
 *      }finally {
 *          释放资源的地方
 *      }
 * 
 * 我们简化一下第一个:
 * try{
 *      可能出现异常的代码
 *  }catch(异常类名 变量名) {
 *      针对异常的代码处理
 *  }
 *
 */
public class ExceptionDemo3 {
    public static void main(String[] args) {
        System.out.println("start");
        int a= 10;
        int b = 0;
        try{
            //可能出现异常的代码
            System.out.println(a/b);//当除数为0的时候会抛出ArithmeticException这个异常
                                    //接着程序会拿着这个异常和catch里面的异常类已经对比                   
        }catch(ArithmeticException e){
            //当程序抛出ArithmeticException这个异常之后给出的具体的处理方法
            System.out.println("你的除数不能为0");
        }
        System.out.println("end");
    }

}

1.3
* 多个异常的处理(演示数组索引越界异常,除数为0异常)
* A:针对每一个出现问题的地方写一个try…catch语句
* B:针对多个异常,采用一个try,多个catch的情况。
* try…catch…catch…
*
* 遇到try里面的问题,就自动和catch里面进行匹配。
* 一旦匹配就执行catch里面的内容,执行完毕后,接着执行后面的代码。
*
* 注意:
* 如果异常间有子父关系,父必须在最后。
* 代码演示:
[Java] 纯文本查看 复制代码
package com.edu_02;

import java.io.FileNotFoundException;

public class Animal {

    public void method() throws FileNotFoundException{}

    public void function(){}

}
package com.edu_02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Cat extends Animal{
    //重写父类的method()方法
    //A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
    public void method() throws FileNotFoundException{}

    //C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
    //重写父类的function方法
    public void function(){
        //因为父类中没有任何异常抛出,子类重写的方法中如果有异常,只能抓不能抛
        try{
            FileInputStream fis = new FileInputStream("D://a.txt");
        }catch(FileNotFoundException e){
            System.out.println("文件未找到");
        }
    }


}
package com.edu_02;
/**
 *  1.9.1
 * 注意:
 *      A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
 *      B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
        C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

        上述仅仅针对编译时期异常
        与运行时期异常无关。
 *
 */
public class ExceptionDemo {

}

1.4
* 编译时期异常和运行时期异常的区别:
* 编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
* FileNotFoundException(文件未找到异常)
* 运行时期异常:无需显示处理,也可以和编译时异常一样处理
* ArithmeticException
[Java] 纯文本查看 复制代码
package com.edu_01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 *  1.4
 * 编译时期异常和运行时期异常的区别:
 * 编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
 *      FileNotFoundException(文件未找到异常)
 * 运行时期异常:无需显示处理,也可以和编译时异常一样处理
 *      ArithmeticException
 */
public class ExceptionDemo5 {
    public static void main(String[] args) {
        // * 运行时期异常:无需显示处理,也可以和编译时异常一样处理
        //   什么是异常的显示处理:try...catch...
        //      ArithmeticException
        try{
            System.out.println(10/0);
        }catch(ArithmeticException e){
            System.out.println("除数为0");
        }

        /**
         * 编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
         * FileNotFoundException(文件未找到异常)
         */
        //此时就会出现一个编译时期的异常,此时程序的异常必须显示处理
        try{
            FileInputStream fis = new FileInputStream("D://a.txt");
        }catch(FileNotFoundException e){
            System.out.println("文件没找到");
        }

    }

}

1.5
* Throwable中的方法:(演示除数为0异常)
* printStackTrace():打印异常信息,程序从出问题的地方开始就会打印创建一个该异常对应的对象,
该对象直接调用打印方法

1.6(演示编译器异常,运行期异常)
* try…catch 是直接进行了处理。
* 而throws则是把异常处理的事情交给了调用者。
*
* throws用在方法上,声明方法有异常,交给调用者处理。
* 但是呢,如果是编译时期异常,调用就必须处理。
* 如果是运行时期异常,调用者可以处理,也可以不处理。

1.7
* throws:(演示文件未找到异常,除数为0异常)
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用,号隔开
* 表示抛出异常,由该方法的调用者来处理
* throws表示出现异常的一种可能,并不一定会发生这些异常
代码演示:
[Java] 纯文本查看 复制代码
package com.edu_01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 *  1.7
 * throws:(演示文件未找到异常,除数为0异常)
 *      用在方法声明后面,跟的是异常类名
 *      可以跟多个异常类名,用,号隔开
 *      表示抛出异常,由该方法的调用者来处理
 *      throws表示出现异常的一种可能,并不一定会发生这些异常
 */
public class ExceptionDemo7 {
    public static void main(String[] args){
        method();
        //method2();//将这个异常交给了调用者去进行处理
                 //1.可以继续往上throws,将异常继续向上进行抛出了
                 //2.自己try..catch...,相当与自己处理了这个异常
        try{
            method2();
        }catch(FileNotFoundException e){
            System.out.println("文件未找到");
        }
        /**
         * 我们以后遇到异常是抛还是抓呢?
         * 答:原则上能抛就抛,等到已经抛到了程序最底层的时候,最好就不要抛了,自己抓取。
         */

    }

    private static void method2() throws FileNotFoundException {
        //此时会抛出一个编译时期的异常,
        //我们必须在方法上进行声明,如果不声明的话,会一直编译报错
        FileInputStream fis = new FileInputStream("D://a.txt");
    }

    private static void method() throws ArithmeticException {
        //在方法声明上声明这个方法可能出现的异常,不代表这个异常一定会出现
        //此时仅仅是告诉我的调用者我的这个方法可能会出现异常,并不做具体的处理,交给
        //调用者自己去处理这个异常
        //此时抛出的 出数为0的异常,属于运行时期异常
        System.out.println(10/5);
    }

}

1.8
* 异常处理:
* try…catch…finally
*
* finally:一般用于释放资源。在数据库操作或者IO流比较常见。
*
* 特点:
* 被finally控制的语句体一定会执行
*
* 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
[Java] 纯文本查看 复制代码
package com.edu_01;
/**
 *  1.8
 * 异常处理:
 * try...catch...finally
 * 
 * finally:一般用于释放资源。在数据库操作或者IO流比较常见。
 * 
 * 特点:
 *      被finally控制的语句体一定会执行
 * 
 *      特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
 *
 */
public class ExceptionDemo8 {
    public static void main(String[] args) {
        try{
            System.out.println(10/0);
        }catch(ArithmeticException e){
            System.out.println("除数为0了");
            //在执行finally语句体之前jvm虚拟机退出了,那么就不会被执行
            System.exit(0);
        }finally{
            //这个代码块里面的代码一定会被执行的
            System.out.println("我是finally我一定会被执行");
        }

    }

}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马