当前位置: 首页 > 知识库问答 >
问题:

编译错误:在相应的try语句正文中从不抛出异常

商焕
2023-03-14

在我更好地学习Java的过程中,我一直试图理解异常处理。我不明白为什么下面的代码不能编译。

编译器消息为:

TestExceptionHandling.java:12: error: exception StupidException is never thrown in body of corresponding try statement
                catch (StupidException stupidEx) {
                ^
  public class TestExceptionHandling {

    public static void main(String argv[]) {

        String output = "";

        try {
            output = "\nCalling method doExTest:\n";
            exTest.doExTest();
        }

        catch (StupidException stupidEx) {
            System.out.println("\nJust caught a StupidException:\n   " + stupidEx.toString());
        }

        System.out.println(output);
    }   
}   

class exTest {

    static long mainThreadId;

    protected static void doExTest() {  //throws StupidException 

        mainThreadId = Thread.currentThread().getId();
        Thread t = new Thread(){
            public void run(){
                System.out.println("Now in run method, going to waste time counting etc. then interrupt main thread.");
                // Keep the cpu busy for a while, so other thread gets going...
                for (int i = 0; i < Integer.MAX_VALUE; i++) {
                    int iBoxed = (int)new Integer(String.valueOf(i));
                    String s = new String("This is a string" + String.valueOf(iBoxed));
                }   
                // find thread to interrupt...
                Thread[] threads = new Thread[0];
                Thread.enumerate(threads);
                for (Thread h: threads) { 
                    if (h.getId() == mainThreadId) {
                        h.interrupt();
                    }
                }
            }
        };

        t.start();

        try {
            Thread.sleep(5000);
        }

        catch (InterruptedException e){
            System.out.println("\nAn InterruptedException " + e.toString() + " has occurred.   Exiting...");
            throw new StupidException("Got an InterruptedException ", e); // ("Got an InterruptedException.   Mutated to StupidException and throwing from doExTest to caller...", e);
        }   

    }
}

class StupidException extends Exception {

    public StupidException(String message, Throwable t) {
        super(message + " " + t.toString());
    }

    public String toString() {
        return "Stupid Exception:  " + super.toString();
    }
}

共有1个答案

柳逸春
2023-03-14

方法需要显式声明它们抛出异常(运行时异常除外,这有点不同)。尝试将doextest方法声明为

protected static void doExTest() throws StupidException {
    ...
}
 类似资料:
  • 我已经看到过一个类似的问题,但是我还没有找到一个解决方案,因为在我的例子中,放入try子句的函数实际上会引发一个异常。 在my try块中,psv main调用方法,该方法打印2并引发名为myexc3的异常。然后,这个异常应该由处理,它应该打印3等等。但代码实际上并不编译: 异常MyExc3从不在相应try语句的正文中抛出 这是为什么?

  • 我不是太笨,不会意识到“try catch”中的代码不能抛出异常。但是我被困在这里,因为我完全从书中复制了代码,所以它在出版时肯定是正确的。这让我想知道代码是否不能再编译了,因为它已经过时了?我意识到这个问题的性质可能会冒犯在座的一些人。如果是的话,请不要在严厉的斥责中过于严厉。 我得到了一个错误: ./streamcopier.java:13:错误:异常IOException从不在相应try语句

  • 执行此代码时,我收到以下错误: JSONException 从不在相应的 try/catch body 语句中抛出。 你能解释一下为什么抛出这个异常吗?语法在我看来还行。

  • 这是我的堆栈代码的数组实现: 这是OverFlowException类: 当我运行这个编译器时给出错误“exception OverFlowException is never thrown in body of response try statement” 然后我意识到我没有包含检查数组是否为isFull()的部分。 我的问题是我在ArrayStack2类中有isFull()方法,以及如何从O

  • 正如您所看到的,我正在方法和构造函数的子句中声明。但我不会在身体的任何地方抛出这个例外。因此,它应该是一个编译时错误,就像我们试图捕获不是从try块抛出的异常一样。但在这种情况下,它编译得很好。有人能解释一下这种行为背后的原因吗?

  • 我让我的程序工作并全部完成(java)。这是一个简短而简单的工作面试程序。我通过抛出自定义异常来处理诸如不正确的输入格式之类的事情。这是最好的方法还是我应该只做一个打印声明?