java基础-关于异常处理

常用到的概念有throws, throw , try, catch, finally 五个关键字
底部有demo工程下载链接,实际操作一下,会更了解



java异常分类,具体细分还有更多,详情直接看源码

这里写图片描述

1、throws

用来声明方法可能会抛出什么异常,但不对异常异性捕获处理,也就是程序该奔溃的还是会奔溃,声明也只是为了提醒后来使用该方法的人,这里有异常,用的时候要捕获处理,不然会出问题。
使用方法:在方法名后。语法格式为:throws 异常类型1,异常类型2…异常类型n。

例如:

public void testThrows throws IOException,SQLException{方法体}

2、throw

用来抛出一个异常,虽然方法声明可能已经抛出异常了,但在方法执行的不同阶段,可能会产生多个异常,throw的作用就是把多个不同的异常抛出来,好让开发人员了解什么时候会出现什么类型的异常,并进行下一步处理。
使用方法:在方法体内。语法格式为:throw 异常对象。
throw无法单用,一般要配合throws语句使用

例如和throws共用

protected void write() throws IOException,SQLException {   
        throw new IOException();

    }

又例如和try…catch公用

protected void testThrow(){
        try {
            方法体
        } catch (Exception e) {
            throw e;
        }
    }

3、try,catch ,finally

一般三个一起用,或者try… catch一起用,try..finally一起用。 其中,并行的catch可以一个,也可以多个。

例如:

private static void read(String filename) {
        try {
            InputStream in = new FileInputStream(filename);
            URL url = new URL("https://www.github.com");
        } catch (FileNotFoundException e) {
            System.out.println("发现异常了");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } finally {
            System.out.println("到底穿山甲说了什么");
        }
    }

catch可以不断嵌套try…catch语句

例如:

private static void read(String filename) {
        try {
            InputStream in = new FileInputStream(filename);
        } catch (FileNotFoundException e) {
            try {
                InputStream ins = new FileInputStream(filename);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            System.out.println("发现异常了");
        }
    }

4、哪些方法要做异常处理的?

一般IDE工具都会提示,然后按提示进行处理就行了,要么直接throws,要么写try,catch处理。
通常包括:网络http相关类,文件读写相关类,数据库相关类等等

5、代码测试

测试a

public class ExceptionTest {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("准备抛出异常");
        InputStream inputStream = new FileInputStream("text.txt");
        System.out.println("这里不会再执行,因为程序已经发生异常了");
    }
}

运行结果如下,直接main方法中写InputStream方法,抛出异常
这里写图片描述

测试b

public class ExceptionTest2 {
    public static void main(String[] args) throws Exception {
        exception();
        System.out.println("这里不会再执行,因为程序已经发生异常了");
    }

    private static void exception() throws Exception {
        System.out.println("exception 准备抛出异常");
    /*当屏蔽下面两句,就不会抛出异常了*/
        throw new Exception();
//        InputStream inputStream = new FileInputStream("text.txt");
    }
}

运行结果如下:main方法体用到了exception()方法,该方法抛出了异常,所以调用该方法的main方法也要在声明中抛出异常,否则报错,这时候我们可以在exception()中直接throw new Exception(); 直接抛出异常,也可以让下面的InputStream抛出异常
这里写图片描述

测试c

public class ExceptionTest3 {
    public static void main(String[] args) {
        /*测试各方法实际效果,可以每次执行一个方法测试*/
        exception1();
//        exception2();
//        exception3();
        System.out.println("测试main,有异常也不怕");
    }

    /*用try...catch捕获异常,并直接抛出,程序会奔溃*/
    private static void exception1() {
        try {
            System.out.println("测试Exception1,发生在异常之前");
            InputStream inputStream = new FileInputStream("text.txt");
            System.out.println("测试Exception1,发生在异常之后,由于上面的句子发生异常了,所以这句不会执行,而直接跳到catch里面了");
        } catch (FileNotFoundException e) {
            /*这里已经捕获了异常,你可以用自定义方法来处理异常,也可以不处理,
            而将异常直接抛出,如果直接抛出,那么效果和在方法声明处 直接throws Exception是一样的*/
            System.out.println("测试Exception1,捕获异常,并直接抛出");
            e.printStackTrace();
        }
    }

    /*用try...catch捕获异常,进行异常处理,不抛出*/
    private static void exception2() {
        try {
            InputStream inputStream = new FileInputStream("text.txt");
        } catch (FileNotFoundException e) {
            System.out.println("测试Exception2,捕获到异常了,现在对它进行处理");
//            屏蔽下面这句,就不会抛出异常了
//            e.printStackTrace();
        }
    }

    /*多个catch语句, 还带着finally语句的情况,若提前运行了System.exit(0),则finally不会执行*/
    private static void exception3() {
        try {
            InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
            InputStream inputStream = new FileInputStream("text.txt");
            System.out.println(inet1);
        } catch (FileNotFoundException e) {
            System.out.println("测试Exception3,捕获到FileNotFoundException异常了,现在对它进行处理");
//            e.printStackTrace();
        } catch (UnknownHostException e) {
//            System.out.println("发现163访问失败的异常,但执行了 System.exit(0);程序终止了,也不会执行后面的语句,包括finally");
//            屏蔽这句System.exit(0); 程序才能继续运行下去
//            System.exit(0);//System.exit(0);为正常退出,非0则为不正常退出,如System.exit(1);
            System.out.println("exception3 准备抛出163访问失败的异常");
            e.printStackTrace();
        } finally {
            System.out.println("finally总会执行的,除非程序突然System.exit了");
        }
    }
}
  • 我们在main中运行exception1()方法看看,输出如下。用try,catch捕获异常,并且将异常直接抛出,不做任何处理

这里写图片描述

  • 接下来我们注释exception1()方法,在运行一下exception2()方法看看效果。 捕获到异常,对它进行处理,而不抛出异常

这里写图片描述

  • 最后再注释以上方法,来运行一下exception3()方法看看。 运用了try,catch,catch,
    finally语句,finally是在最后会运行的,当然还有一种情况finally不运行,就是系统提前System.exit(0);的时候

这里写图片描述

还要注意的是,虽然exception3()中的下面两句都会引发异常

InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
InputStream inputStream = new FileInputStream("text.txt");

但遇到第一个异常之后,程序就不会再处理下一句了,若还想在第一句遇到异常时,第二句还要保证执行的话,那就要用到嵌套的写法的,在第一句catch{}中再嵌套一个try,catch结构


demo工程下载(intellij项目):

http://download.csdn.net/detail/forgot2015/9731942

参考文章,拓展阅读:

http://blog.csdn.net/hguisu/article/details/6155636
http://lavasoft.blog.51cto.com/62575/18920/

个人能力有限,如有错误,恳请不吝赐教,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值