我什么时候应该使用投掷例外?

时间:2016-01-30 13:27:15

标签: java

我应该何时在我的程序中使用 “抛出异常” ?我会在某些时候看到这些类: InputStreamReader BufferedReader 类。但我没有看到 FileReader FileWriter < / em> 类。我看到 FileInputStream FileOutputStream。 当我不使用它时,在代码中显示错误。为什么需要它? 这让我很困惑何时使用它以及我应该使用哪种情况。我是java编程的新手。

在此使用:

import java.io.*;  

class C{  
public static void main(String args[])throws Exception{  
FileInputStream fin=new FileInputStream("hlw.java");  
FileOutputStream fout=new FileOutputStream("M.java");  
int i=0;  
while((i=fin.read())!=-1){  
fout.write((byte)i);  
}  
fin.close();  
fout.close();
}  
}  

此处未使用

import java.io.*;  
class Simple{  
 public static void main(String args[]){  
  try{  
   FileWriter fw=new FileWriter("abc.txt");  
   fw.write("my name is sachin");  
   fw.close();  
  }catch(Exception e){System.out.println(e);}  
  System.out.println("success");  
 }  
}  

3 个答案:

答案 0 :(得分:4)

当存在代码路径时,您需要在方法的throws子句中声明已检查的异常,可以从 函数中抛出异常。

当存在try / catch块时,异常会保留在您的函数中,因此不需要使用throws子句。

另一方面,在您的第一个示例中,您没有try / catch,因此有一个代码路径会抛出IOException,一个已检查的异常,在功能。这就是使throws条款成为必要的原因。

注意:您应该将throws子句与特定的异常类型一起使用,描述您的方法可以抛出的异常。使用throws Exception并不是一个好主意,因为它通过让所有调用者捕获所有类型的异常来破坏首先声明抛出异常的目的,即使你的方法永远不会抛出它们。

答案 1 :(得分:1)

应该可以在以下时间使用它:

  • 您已创建自定义异常,并希望根据特定条件抛出它。
  • 你懒得处理异常并希望传递它们。

但是应该主要尝试使用try-catch块来处理它们。

答案 2 :(得分:0)

TL; DR:你应该从不使用throws Exception

声明您的方法抛出某种Exception旁边是无用的。它也迫使更加不愉快:

try {
    //stuff
} catch(Exception e) {
    //what now?
}

你如何处理“某种未知类型的错误”?

因此,您的方法应该是throws IOException - 这表示您的方法可能会遇到IO问题。

这告诉调用者他们可能必须处理存在IO问题的情况,然后此调用者可以:

  • 要求用户选择其他文件
  • 选择默认文件
  • 退出并显示错误

但这取决于来电者

所以你应该“throw early, catch late”,即系统在遇到错误时应该立即抛出异常。并且你应该继续重新抛出,直到你最终可以有效地处理错误。

举个例子:

  1. 用户选择文件
  2. 触发处理程序
  3. 处理程序调用一些文件加载​​API
  4. API读取文件
  5. ERROR
  6. 可以处理异常的唯一有用位置是1.,因为这里可以要求用户选择不同的文件。在任何其他方面,都不太可能采取有用的行动。