Throwable:Java中所有的异常都有共同的父类Throwable(可抛出)。它有两个重要的子类Error(错误)和Exception(异常),这两个子类也包含大量的子类。
Error(错误):是程序代码无法处理的错误。大多数是java运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。
Exception(异常):是程序代码本身可以处理的异常,对异常处理以后代码不会终止运行。
* 运行异常:都是RuntimeException类及其子类,如NullPointerException(空指针异常),IndexOutOfBoundsException(数组下标越界异常)
该异常特点是Java并不会检查这类异常,就算没有捕捉处理(try catch)或者抛出异常(throws),编译依旧会通过。
* 非运行时异常(编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。这是必须要处理的异常,如果不处理无法通过编译,比如一些强制异常,线程中的异常处理、IO流中的异常处理。
* try:里面是可能出现异常的语句或者代码块。后面可以跟一个或多个catch代码段。出现异常,终止try代码段的执行,根据错误的类型找到对应的catch执行。
1) 必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
3) catch 块与相应的异常类的类型相关。
* catch:出现异常该怎么办 (拿到异常一定做出至少一种处理)
try {
Thread.sleep(1000);
} catch (Exception ef) {
system.out.println("这里最好至少有一种处理方法");
}
* finally:无论是否产生异常都会执行。一般用于资源的清除工作,比如io流的关闭,jdbc的驱动关闭。
InputStream in = null;
try {
in = new FileInputStream("文件绝对路径");
byte[] bt = new byte[in.available()];
String str = new String(bt);
System.out.print(str);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}finally {
try {
// 关闭流,释放资源
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
* throws:用于方法声明时出抛出
* throw:用于实际手动抛出
如果程序代码try catch处理不了某种异常(比如异常并不是该代码块产生,只有抛出)、不知道如何处理该异常、不想try catch,都可以使用抛出。但是,只要程序不停的调用这个方法,就要不停的抛出。
public static void main(String[] args) throws Exception {
new Test2().demo();
}
public void demo() throws Exception{
int x = 1;
if(x == 1)
throw new Exception("手动抛出异常");
}
1.通过继承Exception类声明自己的异常类
2.在方法适当的位置,生成自定义异常的实例,并用throw抛出
3.在方法声明部分用throws语句声明该方法可能抛出异常
public class MyException extends Exception{
public MyException() {
System.out.println("我的异常类");
}
}
---------------------------------------------------
public class MyException2 {
static int a;
public static void main(String[] args) throws MyException {
a = 4;
new MyException2().test();
}
public void test() throws MyException{
if(a<10)
throw new MyException();
}
}
输出: