黑马程序员技术交流社区
标题:
问一个关于异常操作的问题
[打印本页]
作者:
yjsf216
时间:
2015-3-8 23:05
标题:
问一个关于异常操作的问题
本帖最后由 yjsf216 于 2015-3-9 09:11 编辑
try{
bufis= new BufferedInputStream(new FileInputStream("a.mp3"));
bufos= new BufferedOutputStream(new FileOutputStream("b.mp3"));
int by= 0;
while((by=bufis.read())!=-1){
bufos.write(by);
}
}
catch(IOException e){
System.out.println("读取错误");
}
复制代码
这里catch可以打印出错误,那为什么还要
catch(IOException e){
throw new RuntimeException("读取错误");
}
复制代码
都是在屏幕上输出“读取错误”啊
作者:
DuckOne
时间:
2015-3-9 00:56
抛出RuntimeException是为了结束程序吧,我猜是这样的。
作者:
Dark县令
时间:
2015-3-9 01:04
我觉得一般这样的输出错位是给用户看的、开发者自己看的是直接抛出系统的错误!这样才方便自己找出问题和解决问题!
作者:
jiangwenjun
时间:
2015-3-9 03:50
你这个问题就是程序编译和运行的区别!
catch(IOException e){
System.out.println("读取错误");
Exception内的所有异常(不包括RuntimeException)是不会再编译(javac)出现问题,就是说你编程时可能没有出现问题,而不代表客户在运行时不会出现错误, IOException就是这样。
catch(IOException e){
throw new RuntimeException("读取错误");
}
RuntimeException这个很特殊,它的功能就是把可能运行时出现的错误提到编译时,如果有错误就要程序停止在报出()中的内容。如果你看到IO了 你应该有看过了异常。要查漏呀兄弟!我要好多记不住。
加油吧!
作者:
huangchunwei
时间:
2015-3-9 07:13
你只看到了表象,却没了解本质。虽然都是会打印出一句话,但是后者抛出的RuntimeException异常对象,告诉Java虚拟机(jvm)这程序有问题,必须停掉。而你纯粹的打印一句话虽然效果一样,但是如果你后面还有语句,那么程序还会继续往下执行的,试想一下,前面已经错误了,执行后面的还有意义吗。是吧。我是这样理解的。
作者:
一般现在时
时间:
2015-3-9 10:01
从意义上来讲,抛出异常是为了告诉调用你这个方法的上一层代码说这个出错了,如果你不抛异常,而是直接输出,上一层代码是不知道你这里是出了什么错的,因此也不知道如何处理你的错误,在实际开发中,如果你的是底层代码,出了问题,这样直接打印,就可能直接把信息给了用户,而用户根本不知道这是什么意思,所以这种情况要避免!
回到你的问题,io异常本来是编译时异常,你这样
catch(IOException e){
throw new RuntimeException("读取错误");
}是将编译时的异常转化成运行时异常抛出去,因此会在运行时在控制把"java.lang.RuntimeException:读取错误"这个异常信息打印出来!而且打印出来后程序也会继续执行下去(如果还有代码)。
可以这样理解编译时和运行时异常:
1.编译时异常check exception(Exception):如果一个方法抛出check exception,调用代码要么catch要么在方法声明中重抛该异常,也就是说必须要处理。
2.运行是异常 runtime Exception(RuntimeException):如果一个方法抛出RuntimeException,则调用代码可以catch,也可以忽略。由于可以忽略,初学者可能非常喜欢,简单的说runtime exceptin是针对那些“我这里有问题发生,但是告诉你你也不能解决”的问题。
好吧就说这么多,全部手打,希望能帮助到你!如果觉得我说的有问题,希望大家可以提出来!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2