黑马程序员技术交流社区

标题: 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语句。这样写没错,但是一般我们处理了一个异常时,会抛出相应的处理信息或者新的异常给下一环节,方便程序员自定义的异常处理信息。如:
  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;

  3. class ExceptionTest {

  4.         public static void main(String[] args) {
  5.                 try{
  6.                         demo();
  7.                 }catch (FileNotExistException e) {
  8.                         //若反生异常,打印提示信息:文件不存在!
  9.                         System.out.println(e.getMessage());
  10.                 }
  11.         }
  12.        
  13.         public static void demo() throws FileNotExistException{
  14.                 try {
  15.                         //创建IO流中的读取文件的流,可读取文件中的内容,如果不存在,抛出异常
  16.                         FileInputStream fis = new FileInputStream("ExceptionTest.txt");
  17.                 } catch (FileNotFoundException e) {
  18.                         throw new FileNotExistException("文件不存在!",e);
  19.                 }
  20.         }
  21. }
复制代码
自定义异常:
  1. //自定义异常类,继承运行时异常
  2. class FileNotExistException extends RuntimeException{

  3.         public FileNotExistException(String message) {
  4.                 super(message);
  5.         }

  6.         public FileNotExistException(String message, Throwable cause) {
  7.                 super(message, cause);
  8.         }
  9. }
复制代码
当然运行时异常可外抛也可以不外抛,即使在函数上抛了也可以不处理。如果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