【问题标题】:Exception is never thrown in body of corresponding try statement相应的 try 语句体中永远不会抛出异常
【发布时间】:2014-05-02 01:07:45
【问题描述】:

我在 Java 中处理异常时遇到问题,这是我的代码。当我尝试运行此行时出现编译器错误:throw new MojException("Bledne dane");。错误是:

在相应的 try 语句体中永远不会抛出异常 MojException

代码如下:

public class Test {
  public static void main(String[] args) throws MojException {
    // TODO Auto-generated method stub

    for(int i=1;i<args.length;i++){
      try{
        Integer.parseInt(args[i-1]);
      }
      catch(MojException e){
        throw new MojException("Bledne dane");
      }
      try{
        WierszTrojkataPascala a = new WierszTrojkataPascala(Integer.parseInt(args[0]));
        System.out.println(args[i]+" : "+a.wspolczynnik(Integer.parseInt(args[i])));
      }
      catch(MojException e){
        throw new MojException(args[i]+" "+e.getMessage());
      }
    }
  }
}

这是MojException的代码:

public class MojException extends Exception{
    MojException(String s){
        super(s);
    }
}

谁能帮我解决这个问题?

【问题讨论】:

  • 什么是编译器错误?
  • 嗯...MojException 不会被Integer.parseInt 抛出...
  • 总是,总是总是告诉我们错误是什么,而不仅仅是你有一个错误。
  • 异常 MojException 永远不会在相应的 try 语句的主体中抛出 - 这是错误消息。
  • 迟到的答案... 扩展 RuntimeException ... 不是异常..

标签: java exception


【解决方案1】:

try 语句中的 catch-block 需要 准确 捕获 try {}-block 内的代码 可以 抛出的异常(或其超类) )。

try {
    //do something that throws ExceptionA, e.g.
    throw new ExceptionA("I am Exception Alpha!");
}
catch(ExceptionA e) {
    //do something to handle the exception, e.g.
    System.out.println("Message: " + e.getMessage());
}

你想要做的是:

try {
    throw new ExceptionB("I am Exception Bravo!");
}
catch(ExceptionA e) {
    System.out.println("Message: " + e.getMessage());
}

这将导致编译器错误,因为您的 java 知道您正在尝试捕获一个永远不会发生的异常。因此你会得到:exception ExceptionA is never thrown in body of corresponding try statement

【讨论】:

  • 根据你的解释,这段代码也应该抛出错误,但编译得很好。你能解释一下为什么吗?导入java.io.*;类 a { public static void main(String [] args) { try { new a().go(); } catch(Exception e) { System.out.println("error"); } } 无效 go() {} }
  • 我现在手头没有 IDE,但我认为由于 'Exception' 是已检查和未检查异常的超类,它会编译。例如,Nullpointer-Exception(这是一个未经检查的异常,是 Exception 的子类)基本上可以在任何地方抛出,因此代码可以编译...
  • 你的剪辑太棒了——是的,这正是我想要写的!准确地说,我的ExceptionAInterruptedException,它显然从未写在代码中,而是从其他线程提出来的。我怎样才能catch InterruptedException
  • @TheGodfather:我认为这里回答了你的问题 -> stackoverflow.com/questions/6546193/…
【解决方案2】:

正如 cmets 中所指出的,您无法捕获 try 块中的代码未引发的异常。尝试将您的代码更改为:

try{
    Integer.parseInt(args[i-1]); // this only throws a NumberFormatException
}
catch(NumberFormatException e){
    throw new MojException("Bledne dane");
}

始终检查documentation 以查看每种方法引发了哪些异常。您可能还希望阅读checked vs unchecked exceptions 的主题,以免将来引起您的任何困惑。

【讨论】:

  • 好的,现在它可以工作了,但我仍然没有得到我想从那个异常中得到的消息(Bledne dane),现在我得到了正常的异常消息(线程“main”java.lang.朗...
  • @user3407967 你能发布你的整个异常消息吗?
  • E:\workspace\pascal1\src\pascal1>java 测试 8 线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:java.lang.NumberFormatException.forInputString 处的“a” (Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at Test.main(Test.java:14)
  • @user3407967 该异常在第 14 行引发,该行位于您的 second 块中。您必须调整该 catch 子句的异常消息。
  • 您必须将所有内容包装在另一个 try-catch-block 中才能使其工作。但老实说,那将是非常难看的代码。我认为您首先必须更加熟悉异常处理的基本概念!您在这里尝试的是抛出一个异常来抛出另一个异常。通常这不是必需的,也不会产生好的代码。
【解决方案3】:

任何扩展Exception 类的类都是用户定义的检查异常类,而任何扩展RuntimeException 的类都是未检查异常类。 如User defined exception are checked or unchecked exceptions 中所述 所以,不抛出检查的异常(无论是用户定义的还是内置的异常)都会产生编译时错误。

Checked exception是在编译时检查的异常。

未经检查的异常是编译时不检查的异常

【讨论】:

    【解决方案4】:

    永远记住,在已检查异常的情况下,您只能在抛出异常后才能捕获(您抛出或代码中使用的任何内置方法都可以抛出),但在未检查异常的情况下,即使您没有抛出异常,您也可以捕获那个例外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2017-07-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多