黑马程序员技术交流社区
标题:
java异常的一点小疑问
[打印本页]
作者:
殷婷婷
时间:
2013-6-6 18:22
标题:
java异常的一点小疑问
本帖最后由 殷婷婷 于 2013-6-8 10:07 编辑
当函数内有throw语句时,可以在函数上throws,也可以写try catch语句,那如果我既写throws声明又写try,catch语句,这样对吗?对的话,发生异常是执行抛出还是catch啊?
还有,有了catch语句就是处理异常了,但是如果catch语句是空的,那不是等于什么都没写吗?这样算是处理异常了吗?
最后,对发生的异常一直throws到最后,不做其他事情,这样能通过吗?
作者:
刘晓GGG
时间:
2013-6-6 18:33
捕获了异常,catch语句里面什么都不写,也算是处理异常,该异常就不会再被抛出。异常一直被抛,最后会抛给JVM,JVM停止运行,程序关闭。
作者:
yufeng47
时间:
2013-6-6 19:41
1、既写throws声明又写try,catch语句。这样写没错,但是一般我们处理了一个异常时,会抛出相应的处理信息或者新的异常给下一环节,方便程序员自定义的异常处理信息。如:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
class ExceptionTest {
public static void main(String[] args) {
try{
demo();
}catch (FileNotExistException e) {
//若反生异常,打印提示信息:文件不存在!
System.out.println(e.getMessage());
}
}
public static void demo() throws FileNotExistException{
try {
//创建IO流中的读取文件的流,可读取文件中的内容,如果不存在,抛出异常
FileInputStream fis = new FileInputStream("ExceptionTest.txt");
} catch (FileNotFoundException e) {
throw new FileNotExistException("文件不存在!",e);
}
}
}
复制代码
自定义异常:
//自定义异常类,继承运行时异常
class FileNotExistException extends RuntimeException{
public FileNotExistException(String message) {
super(message);
}
public FileNotExistException(String message, Throwable cause) {
super(message, cause);
}
}
复制代码
当然运行时异常可外抛也可以不外抛,即使在函数上抛了也可以不处理。如果FileNotExistException异常是编译时异常的话,就必须得在调用是处理。
2、如果catch语句是空的,也表示处理了异常,只是处理的结果是什么都不做而已,catch本身就是处理异常,程序员是否要添加处理信息不影响,只是我们处理异常其实最终都是给用户看的。但是异常信息不能发给用户,所以类似上面 main 方法中:只会打印出提示语句,不会抛出异常给用户。
3、对发生的异常一直throws到最后,不做其他事情。这样发生异常时,异常就抛给了JVM,JVM因此出现无法处理的情况,就会把异常打印出来。这种做法在初始学习时经常用到,真正开发中不是允许的。否则就会把异常抛给用户,用户处理不了这个东西的。
作者:
a303466738
时间:
2013-6-6 23:22
问题1:当函数内有throw语句时,可以在函数上throws,也可以写try catch语句,那如果我既写throws声明又写try,catch语句,这样对吗?
对的话,发生异常是执行抛出还是catch啊?
你可以同时写throws和try,catch。但是一般没必要写2个进去。
同时写时是先执行try,catch。因为throws是抛给了jvm,jvm执行throws时会先检测try,catch。
其次,对于先执行还是后执行,这个问题以后再有最好自己打代码试试。练习能力还记忆深刻。
问题2:有了catch语句就是处理异常了,但是如果catch语句是空的,那不是等于什么都没写吗?这样算是处理异常了吗?
只要你写了try,catch语句,jvm就认为你处理了异常,catch语句中是对异常的处理,一般都是返回一个用户能读懂的信息。
你什么也不写,发生异常时,也算处理了,但是返回的信息是空白的,比如你写java程序时,遇到错误jvm会给你提示(虽然是英文的....),然后结束。但如果不提示,直接结束,你就迷茫了。
所以一般建议自己写try,catch,因为你不能把错误原因返回给用户,也要给用户一个看的懂的信息。
举个简单的例子:
class Demo {
public static void main(String[] args) throws IOException{
try {
FileReader fr = new FileReader("b.txt");
System.out.println(fr);
} catch (IOException e) {
System.out.println("这个要读取的文件不存在!");
//e.printStackTrace();
}
}
}
上面的程序是IO中一个读取文件的一段代码。当你要读取的文件不存在时,就会报错。
上面的代码用了try,catch,也用了throws。
但是先执行try,catch。
而catch中的代码就是处理结果。
如果不写System.out.println("这个要读取的文件不存在!");
写的是默认的e.printStackTrace();等于是又调回了jvm的方法,返回java.io.FileNotFoundException
英语不好就看不懂了...
最后,对发生的异常一直throws到最后,不做其他事情,这样能通过吗?
只要你抛了就肯定能通过,但是以后会很麻烦。
假设你有问题就抛,写的是很长的代码,写完后一运行...........
作者:
黄辉
时间:
2013-6-7 02:15
多建议你使用try/catch,两种一起写也是可以的,但是throws是抛出异常,然后就虚拟机就不管了,你就看着异常毛病吧
这在开始搭建程序整个框架时很好用,因为一目了然你知道问题在哪,抛出了什么异常。
但当程序需要上线需要发布,你不能把异常给用户看到了吧。
所以测试的时候用throws OK 但最终还是要多写try/catch
作者:
殷婷婷
时间:
2013-6-8 10:22
yufeng47 发表于 2013-6-6 19:41
1、既写throws声明又写try,catch语句。这样写没错,但是一般我们处理了一个异常时,会抛出相应的处理信息或 ...
谢谢哈,受教了:lol
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2