我正在编写用于将文件读入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.");
}
我很感激你的回答! 谢谢!
答案 0 :(得分:2)
方法声明的throws
子句中列出异常的顺序完全无关紧要。它绝对不必与您在代码中抛出异常的位置有任何关系。
假设这是一个只从JVM调用的主方法,并且你的代码都没有实际调用这个方法,这是一次可以保存自己一些打字和写throws Exception
的完美方法。 (另一方面,如果您重构main方法以便它调用处理不同函数的单独方法,那么您希望这些方法更能描述它们抛出的已检查异常的内容。)
答案 1 :(得分:1)
throws
子句中的异常顺序对调用代码没有任何功能影响。也没有省略未经检查的throwable(源自Error
或RuntimeException
的那些)。但是,您需要声明任何已检查的例外情况;它们不是可选的。
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