Java中抛出异常的顺序

时间:2016-01-28 20:37:14

标签: java exception

我正在编写用于将文件读入Java的代码。

我有一个抛出三个例外的主方法。 我想知道如果我在public static void main(String[] args)的同一行中切换编写异常的顺序会有什么影响。

public class SwitchTester {

    private static Scanner pathInput;

    public static void main(String[] args) throws IOException, NoSuchElementException, IllegalStateException{

我使用main方法中的代码。 我使用的异常顺序是此代码中的IOException,NoSuchElementException,IllegalStateException。 在主线保持相同的顺序是否重要? 将投掷保持在主线还是根本不重要?

    try{         
        pathInput = new Scanner(path);
    }catch(IOException ioException){
        System.err.println("Error opening file. Terminating.");
        System.exit(1);
    }

    System.out.printf("%-10s%-15s%-15s%10s%n", "Port", "Destination",
             "Source", "Data-type");

    //readRecords
    try{
        while(pathInput.hasNext()){ //while there is more to read, display record contents
            System.out.printf("%-10s%-15s%-15s%10s%n", pathInput.next(), 
                    pathInput.next(), pathInput.next(), pathInput.next());
        }
     }catch(NoSuchElementException elementException){
         System.err.println("File improperly formed. Terminating.");
     }catch(IllegalStateException stateException){
         System.err.println("Error reading from file. Terminating.");
     }

我很感激你的回答! 谢谢!

3 个答案:

答案 0 :(得分:2)

方法声明的throws子句中列出异常的顺序完全无关紧要。它绝对不必与您在代码中抛出异常的位置有任何关系。

假设这是一个只从JVM调用的主方法,并且你的代码都没有实际调用这个方法,这是一次可以保存自己一些打字和写throws Exception的完美方法。 (另一方面,如果您重构main方法以便它调用处理不同函数的单独方法,那么您希望这些方法更能描述它们抛出的已检查异常的内容。)

答案 1 :(得分:1)

throws子句中的异常顺序对调用代码没有任何功能影响。也没有省略未经检查的throwable(源自ErrorRuntimeException的那些)。但是,您需要声明任何已检查的例外情况;它们不是可选的。

JLS 8.4.6记录了throws子句的要求:

  

允许但不要求在throws子句中提及未经检查的异常类(§11.1.1)。

通常,您需要注意的是,是否要在throws子句或离散子类中声明超类。例如,说throws Exception代替例如throws FileNotFoundException通常是不好的做法。 localhost:8080/create-template/因为它会给想要智能处理抛出异常的调用者带来更大的负担。

答案 2 :(得分:1)

当您捕获异常时,您应始终首先捕获specific,然后捕获最多generic,但如果您抛出异常类型,则无需捕获它们。

有关异常的更多信息,请查看hierarchy-of-exception和此package-tree