第一种情况: 
throw new IllegalStateException("Cannot execute task:"
                            + " the task is already running.");
在代码中直接抛出即可,如果遇到这类异常,程序会异常终止。
但是我们不需要try catch或者再次的throws。第二种情况: 
throw new Exception("Cannot execute task:"
                            + " the task is already running.");
为什么这种异常需要try catch或者再次的throws?他们都是同一个异常父类,有什么不一样的吗?求教?

解决方案 »

  1.   

    异常也是逻辑的一部分,如果有异常抛出,没有捕获处理,那么就会抛出异常的逻辑层一层一层向外继续抛,如果到该程序的顶层,还没有逻辑处理异常,那么程序就会崩掉理论上所有的异常都需要捕获~ 不应该有‘需要捕获’和‘不需要捕获’的异常。楼主的第一个例子,其实也可以处理得更好,比如捕获下来,显示个错误的提示框显示错误信息,让应用程序正常终止不是更好么?否则用户就要去看log文件或控制台输出才知道原因
      

  2.   

    异常,错误都是同一种父类:java.lang.ThrowableIllegalStateException属于RuntimeException,RuntimeException又是Exception的子类RuntimeException的特点是非受检异常,区别于受检异常,也就是java系统允许可以不catch(当然也可以人为catch,比如特殊业务逻辑需要),在运行时碰到就抛出
      

  3.   

    关键RuntimeException为什么会被系统允许不被catch...
    也就是可能会抛出RuntimeException的方法不被要求在方法throws clause中声明。原因我想RuntimeException相对那些受检异常有更多的不确定性和普遍性,如果改为受检异常,代价较大,也没必要,因为一般它总不为业务逻辑所容。对比几个可能会有更好的实感:
    受检异常:ClassNotFoundException, SQLException, NoSuchMethodException...
    RuntimeException:NullPointerException, IllegalArgumentException, ArithmeticException
      

  4.   

    补充:
    如果把异常按检查分为两大类:
    checked/unchecked exceptionchecked exception的检出工作是由编译器完成的,不确定性高的RuntimeException编译器无法检出或无法轻易检出(所以只能由jvm检出了)
      

  5.   

    楼主:提醒一下,你的结帖率太低了,如果是这样的话我相信以后会很少有人愿意回答你的问题
    java有两种主要的异常:runtime exception 和 checked exception .checked异常也就是我们经常遇到的io异常以及SQL异常,对于这种异常,我们必须进行处理。
    runtime异常也称运行时异常,我们可以不处理,这种异常有虚拟机接管
      

  6.   

    都是要捕获的,IllegalStateException  是RuntimeException,建议不对其进行捕获,
    打个比方:你的一个对象的引用是 null,而你却调用他的某个方法,这样的Exception你捕获好像不怎么有意义吧。
    你的下面的Exception(继承Exception 而没有继承RuntimeException)是 checked Exception,当然要进行捕获哈···
      

  7.   

    上面说的检出异常由编译器应该不对异常按严重性排序RuntimeException(可预防,可恢复) < Exception,除RuntimeException(不可预防,可恢复) < Error(不可预防,不可恢复)  
      

  8.   

    int a = 88 / 0;
    像这个就会报ArithmeticException,但是不需要你人为捕获,这是程序运行时异常,是可以避免的异常。
    在编译阶段不会报这个异常的,只有执行的时候才会报出异常。
    加上try...catch...完全没有错。。