how2j.cn


工具版本兼容问题
异常处理常见手段: try catch finally throws

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



11分35秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



步骤 1 : try catch   
步骤 2 : 使用异常的父类进行catch   
步骤 3 : 多异常捕捉办法1   
步骤 4 : 多异常捕捉办法2   
步骤 5 : finally   
步骤 6 : throws   
步骤 7 : throw和throws的区别   
步骤 8 : 练习-异常处理   
步骤 9 : 答案-异常处理   

步骤 1 :

try catch

1.将可能抛出FileNotFoundException 文件不存在异常的代码放在try里
2.如果文件存在,就会顺序往下执行,并且不执行catch块中的代码
3. 如果文件不存在,try 里的代码会立即终止,程序流程会运行到对应的catch块中
4. e.printStackTrace(); 会打印出方法的调用痕迹,如此例,会打印出异常开始于TestException的第16行,这样就便于定位和分析到底哪里出了异常
try catch
package exception; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { File f= new File("d:/LOL.exe"); try{ System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); } catch(FileNotFoundException e){ System.out.println("d:/LOL.exe不存在"); e.printStackTrace(); } } }
步骤 2 :

使用异常的父类进行catch

FileNotFoundException是Exception的子类,使用Exception也可以catch住FileNotFoundException
package exception; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { File f= new File("d:/LOL.exe"); try{ System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); } catch(Exception e){ System.out.println("d:/LOL.exe不存在"); e.printStackTrace(); } } }
步骤 3 :

多异常捕捉办法1

有的时候一段代码会抛出多种异常,比如

new FileInputStream(f);
Date d = sdf.parse("2016-06-03");

这段代码,会抛出 文件不存在异常 FileNotFoundException 和 解析异常ParseException
解决办法之一是分别进行catch

catch (FileNotFoundException e) {
System.out.println("d:/LOL.exe不存在");
e.printStackTrace();
} catch (ParseException e) {
System.out.println("日期格式解析错误");
e.printStackTrace();
}
package exception; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TestException { public static void main(String[] args) { File f = new File("d:/LOL.exe"); try { System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse("2016-06-03"); } catch (FileNotFoundException e) { System.out.println("d:/LOL.exe不存在"); e.printStackTrace(); } catch (ParseException e) { System.out.println("日期格式解析错误"); e.printStackTrace(); } } }
步骤 4 :

多异常捕捉办法2

另一个种办法是把多个异常,放在一个catch里统一捕捉

catch (FileNotFoundException | ParseException e) {

这种方式从 JDK7开始支持,好处是捕捉的代码更紧凑,不足之处是,一旦发生异常,不能确定到底是哪种异常,需要通过instanceof 进行判断具体的异常类型

if (e instanceof FileNotFoundException)
System.out.println("d:/LOL.exe不存在");
if (e instanceof ParseException)
System.out.println("日期格式解析错误");
package exception; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TestException { public static void main(String[] args) { File f = new File("d:/LOL.exe"); try { System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse("2016-06-03"); } catch (FileNotFoundException | ParseException e) { if (e instanceof FileNotFoundException) System.out.println("d:/LOL.exe不存在"); if (e instanceof ParseException) System.out.println("日期格式解析错误"); e.printStackTrace(); } } }
步骤 5 :

finally

无论是否出现异常,finally中的代码都会被执行
package exception; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { File f= new File("d:/LOL.exe"); try{ System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); } catch(FileNotFoundException e){ System.out.println("d:/LOL.exe不存在"); e.printStackTrace(); } finally{ System.out.println("无论文件是否存在, 都会执行的代码"); } } }
步骤 6 :

throws

考虑如下情况:
主方法调用method1
method1调用method2
method2中打开文件

method2中需要进行异常处理
但是method2不打算处理,而是把这个异常通过throws抛出去
那么method1就会接到该异常。 处理办法也是两种,要么是try catch处理掉,要么也是抛出去
method1选择本地try catch住 一旦try catch住了,就相当于把这个异常消化掉了,主方法在调用method1的时候,就不需要进行异常处理了
package exception; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class TestException { public static void main(String[] args) { method1(); } private static void method1() { try { method2(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void method2() throws FileNotFoundException { File f = new File("d:/LOL.exe"); System.out.println("试图打开 d:/LOL.exe"); new FileInputStream(f); System.out.println("成功打开"); } }
步骤 7 :

throw和throws的区别

throws与throw这两个关键字接近,不过意义不一样,有如下区别:
1. throws 出现在方法声明上,而throw通常都出现在方法体内。
2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
步骤 8 :

练习-异常处理

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
假设有一个方法 public int method(), 会返回一个整数
在这个方法中有try catch 和 finally.
try 里返回 1
catch 里 返回 2
finally 里 返回3
那么,这个方法到底返回多少?
步骤 9 :

答案-异常处理

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分32秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


可以看到,最后结果是取finally的返回值3.
同时,故意把method设计成调用 return1(),return2(),return3()。
可以观察到,try里的 返回和 finally的返回都是执行了的,不过最后选择使用finally里的返回的值
答案-异常处理
package exception; public class TestException { public static int method() { try { return return1(); } catch (Exception e) { return return2(); } finally { return return3(); } } private static int return1() { System.out.println("return 1"); return 1; } private static int return2() { System.out.println("return 2"); return 2; } private static int return3() { System.out.println("return 3"); return 3; } public static void main(String[] args) { int result = method(); System.out.println("result:" + result); } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-11-08 两种不同结果? 交作业
茶客



在try里面直接打印可以打印出来1和3 在return后再打印就是只有3 前面那个可以理解,后面是什么情况呢?
package exception;

public class TestException {
    public static int method(){
        try{
            return 1;
        }catch(Exception e){
            return 2;
        }
        finally {
            return 3;
        }
    }

    public static void main(String[] args) {
        try {
            System.out.println(1);
        } catch (Exception e) {
            System.out.println(2);
        } finally {
            System.out.println(3);
        }

        int a = method();
        System.out.println(a);
    }
}

							


1 个答案

xwyjrcmbs 答案时间:2018-11-14
因为他先运行 return 1 然后在运行 return 3 然后把3 赋值给a 所以输出是3 在函数里怎么return 都只会return一个值回来的 肯定不会先输出1 再输出3




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-09-26 异常捕捉机制
ydd
捕捉到第一个异常,后面的解析异常就捕捉不到了吧?




1 个答案

爆浆田螺 答案时间:2018-09-28
try 捕捉到异常就不会继续运行try了吧,应该根据异常跳到catch了吧




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-09-04 交作业,返回finally的值
2018-09-02 按在地上摩擦~
2018-08-29 按在地上摩擦~
2018-08-07 交作业
2018-07-27 交作业
2018-05-16 作业
2018-05-16 多异常捕获办法2出现错误
2018-03-05 最后练习为甚要用静态方法
2017-12-08 为什么finally输出的信息穿插在e.printStackTrace();里面
2017-09-13 多种异常能否用Exception进行catch
2017-08-21 步骤3 和 步骤4 的样例代码,捕捉多个异常的时候,我个人运行结果发现;发生了第一个异常,后续代码就不执行了,并不能一次把代码中的所有异常都捕捉!!
2017-07-21 站长,为什么我的积分变负的9000多了……
2017-06-26 请站长大大看下我的理解对不对
2017-06-08 请问打印出方法的调用痕迹,括号里是unknown source,怎么解决呀?
2017-05-31 throws和throw
2017-05-30 为什么只能捕捉到文件异常,时间的判断不出来?
2017-03-19 int result = method();
2017-03-18 什么情况下该用异常处理呢
2016-09-11 最后的练习结果为什么是这样




提问之前请登陆
关于 JAVA 中级-异常处理-异常处理 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 902680467
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图