Java自定义例外

时间:2015-11-09 19:37:40

标签: java exception exception-handling try-catch interrupted-exception

我想重现InterruptedException行为的一部分,但我不明白它是如何工作的......

所以我有这段代码:

public static void main(String [] args){
    try{
    }catch(InterruptedException ie){
    }
}

当我尝试编译它时,我得到了这个编译器错误

Unreachable catch block for InterruptedException. This exception is never thrown from the try statement body

我做了一个自定义异常,这不是一个异常,因为它没有扩展异常......

class MyException extends Throwable{
}
public static void main(String [] args){
    try{
    }catch(MyException ie){
    }
}

显示相同的编译器错误

Unreachable catch block for MyException. This exception is never thrown from the try statement body

然后我做了这个

public static void main(String [] args){
    try{
        throw new MyException();
    } catch(MyException e){
        e.printStackTrace();
    }

    try{
        throw new InterruptedException();
    } catch(InterruptedException e){
        e.printStackTrace();
    }
}

他们两个都编译得很好。

但现在是棘手的部分......

public static void main(String [] args){
    try{
        throw new MyException();
    } catch(Exception e){
        e.printStackTrace();
    } catch(MyException e){
        e.printStackTrace();
    }

    try{
        throw new InterruptedException();
    } catch(Exception e){
        e.printStackTrace();
    } catch(InterruptedException e){
        e.printStackTrace();
    }
}

编译说

Unreachable catch block for InterruptedException. It is already handled by the catch block for Exception

你能告诉我InterruptedException如何显示InterruptedException的" Unreachable catch块。永远不会从try语句主体"中抛出此异常。编译器错误并在同一时间扩展Exception,因为当我扩展异常时,我的自定义异常不会显示此编译器错误

举个例子:

class MyException extends Exception{}

public static void main(String [] args){
    try{        
    }catch(MyException me){     
    }
}

此代码不会抛出任何编译器错误

但以下代码

class MyException extends Throwable{}

public static void main(String [] args){
    try{        
    }catch(MyException me){     
    }
}

2 个答案:

答案 0 :(得分:1)

这是因为InterrupedExceptionException的子类,但前一个Exception块已捕获catch

Section 11.2.3 of the JLS州:

  

如果catch子句可以捕获异常类E1并且紧跟的try语句的前一个catch子句可以捕获E1或E1的超类,那么这是一个编译时错误。

InterruptedException catch块中的块将是无法访问的代码,这将是此编译器错误的理由。

答案 1 :(得分:0)

你正在聊天抛出异常因此必须从某个地方抛出

顺便说一句:我的编译器显示第一个脚本和第二个脚本的错误