异常处理有几个概念要搞清楚:
1.Exception类和Error类继承自Throwable,这个是基类,Error没法处理,只有Exception可以捕获处理。
2.Exception类的子类有RuntimeException和非RuntimeException,例如IOException和SQLException。
3.异常有两种处理方式:
* 捕获并处理异常
* 抛出异常,让上一级调用去处理,到main函数时还没有处理,则JVM会退出,打印报告错误
4.异常分为Runtime异常和Checked异常(非Runtime异常)
Checked异常是在编译期检查,如果有未处理的异常,则编译不通过。
Runtime异常是在程序运行时检查
5.Checked异常有两种情况:
* 知道如何处理,用try...catch块
* 不知道如何处理:在定义方法时使用throws抛出异常
6.Runtime异常有两种情况:
* 程序无须在方法中声明抛出Checked异常,一旦发生自定义错误,程序只管抛出Runtime异常即可,通过throw。
* 如果需要捕获并处理异常,则可以使用try...catch块来捕获
7.自定义Runtime异常类,继承Exception或者RuntimeException,需要有2个构造函数,有参构造函数主要是接收程序传递过来转译的异常信息
public class MyException extends Exception {
public MyException() {
}
public MyException(String message)
{
super(message);
}
}
8.throws和try...catch可以同时用,try...catch中做自己可以处理的事情,如果其他问题处理不了,丢给上层调用者处理
9.catch和throw有时需同时使用:有时一个异常不能再一个catch中一次处理完,比如企业中发生异常,需要将异常记录在日志中,也需要将异常转译后返回给用户,这样就不可能在catch中处理完成,这时使用throw将异常抛给调用它的上一级,这样的作用就可以弥补只用try...catch或者只用throws了。在使用throw时,所在的方法声明时必须使用throws抛出相同的异常。
public static void main(String[] args) throws MyException
{
// TODO Auto-generated method stub
//System.out.println("please input a file:\n");
fun();
}
public static void fun()throws MyException {
Scanner sc;
try {
sc = new Scanner(new File("D:/Hello13.txt"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new MyException("异常");
}
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
}
10.一般都是捕获了异常,但是并没有对它进行处理,有些异常不能不处理,也不能不提示,否则不知道异常发生在哪里
11.企业一般都会分层去处理异常