常用到的概念有throws, throw , try, catch, finally 五个关键字
(底部有demo工程下载链接,实际操作一下,会更了解)
java异常分类,具体细分还有更多,详情直接看源码
1、throws
用来声明方法可能会抛出什么异常,但不对异常异性捕获处理,也就是程序该奔溃的还是会奔溃,声明也只是为了提醒后来使用该方法的人,这里有异常,用的时候要捕获处理,不然会出问题。
使用方法:在方法名后。语法格式为:throws 异常类型1,异常类型2…异常类型n。
例如:
public void testThrows throws IOException,SQLException{方法体}
2、throw
用来抛出一个异常,虽然方法声明可能已经抛出异常了,但在方法执行的不同阶段,可能会产生多个异常,throw的作用就是把多个不同的异常抛出来,好让开发人员了解什么时候会出现什么类型的异常,并进行下一步处理。
使用方法:在方法体内。语法格式为:throw 异常对象。
throw无法单用,一般要配合throws语句使用
例如和throws共用
protected void write() throws IOException,SQLException {
throw new IOException();
}
又例如和try…catch公用
protected void testThrow(){
try {
方法体
} catch (Exception e) {
throw e;
}
}
3、try,catch ,finally
一般三个一起用,或者try… catch一起用,try..finally一起用。 其中,并行的catch可以一个,也可以多个。
例如:
private static void read(String filename) {
try {
InputStream in = new FileInputStream(filename);
URL url = new URL("https://www.github.com");
} catch (FileNotFoundException e) {
System.out.println("发现异常了");
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} finally {
System.out.println("到底穿山甲说了什么");
}
}
catch可以不断嵌套try…catch语句
例如:
private static void read(String filename) {
try {
InputStream in = new FileInputStream(filename);
} catch (FileNotFoundException e) {
try {
InputStream ins = new FileInputStream(filename);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
System.out.println("发现异常了");
}
}
4、哪些方法要做异常处理的?
一般IDE工具都会提示,然后按提示进行处理就行了,要么直接throws,要么写try,catch处理。
通常包括:网络http相关类,文件读写相关类,数据库相关类等等
5、代码测试
测试a
public class ExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("准备抛出异常");
InputStream inputStream = new FileInputStream("text.txt");
System.out.println("这里不会再执行,因为程序已经发生异常了");
}
}
运行结果如下,直接main方法中写InputStream方法,抛出异常
测试b
public class ExceptionTest2 {
public static void main(String[] args) throws Exception {
exception();
System.out.println("这里不会再执行,因为程序已经发生异常了");
}
private static void exception() throws Exception {
System.out.println("exception 准备抛出异常");
/*当屏蔽下面两句,就不会抛出异常了*/
throw new Exception();
// InputStream inputStream = new FileInputStream("text.txt");
}
}
运行结果如下:main方法体用到了exception()方法,该方法抛出了异常,所以调用该方法的main方法也要在声明中抛出异常,否则报错,这时候我们可以在exception()中直接throw new Exception(); 直接抛出异常,也可以让下面的InputStream抛出异常
测试c
public class ExceptionTest3 {
public static void main(String[] args) {
/*测试各方法实际效果,可以每次执行一个方法测试*/
exception1();
// exception2();
// exception3();
System.out.println("测试main,有异常也不怕");
}
/*用try...catch捕获异常,并直接抛出,程序会奔溃*/
private static void exception1() {
try {
System.out.println("测试Exception1,发生在异常之前");
InputStream inputStream = new FileInputStream("text.txt");
System.out.println("测试Exception1,发生在异常之后,由于上面的句子发生异常了,所以这句不会执行,而直接跳到catch里面了");
} catch (FileNotFoundException e) {
/*这里已经捕获了异常,你可以用自定义方法来处理异常,也可以不处理,
而将异常直接抛出,如果直接抛出,那么效果和在方法声明处 直接throws Exception是一样的*/
System.out.println("测试Exception1,捕获异常,并直接抛出");
e.printStackTrace();
}
}
/*用try...catch捕获异常,进行异常处理,不抛出*/
private static void exception2() {
try {
InputStream inputStream = new FileInputStream("text.txt");
} catch (FileNotFoundException e) {
System.out.println("测试Exception2,捕获到异常了,现在对它进行处理");
// 屏蔽下面这句,就不会抛出异常了
// e.printStackTrace();
}
}
/*多个catch语句, 还带着finally语句的情况,若提前运行了System.exit(0),则finally不会执行*/
private static void exception3() {
try {
InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
InputStream inputStream = new FileInputStream("text.txt");
System.out.println(inet1);
} catch (FileNotFoundException e) {
System.out.println("测试Exception3,捕获到FileNotFoundException异常了,现在对它进行处理");
// e.printStackTrace();
} catch (UnknownHostException e) {
// System.out.println("发现163访问失败的异常,但执行了 System.exit(0);程序终止了,也不会执行后面的语句,包括finally");
// 屏蔽这句System.exit(0); 程序才能继续运行下去
// System.exit(0);//System.exit(0);为正常退出,非0则为不正常退出,如System.exit(1);
System.out.println("exception3 准备抛出163访问失败的异常");
e.printStackTrace();
} finally {
System.out.println("finally总会执行的,除非程序突然System.exit了");
}
}
}
- 我们在main中运行exception1()方法看看,输出如下。用try,catch捕获异常,并且将异常直接抛出,不做任何处理
- 接下来我们注释exception1()方法,在运行一下exception2()方法看看效果。 捕获到异常,对它进行处理,而不抛出异常
- 最后再注释以上方法,来运行一下exception3()方法看看。 运用了try,catch,catch,
finally语句,finally是在最后会运行的,当然还有一种情况finally不运行,就是系统提前System.exit(0);的时候
还要注意的是,虽然exception3()中的下面两句都会引发异常
InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
InputStream inputStream = new FileInputStream("text.txt");
但遇到第一个异常之后,程序就不会再处理下一句了,若还想在第一句遇到异常时,第二句还要保证执行的话,那就要用到嵌套的写法的,在第一句catch{}中再嵌套一个try,catch结构
demo工程下载(intellij项目):
http://download.youkuaiyun.com/detail/forgot2015/9731942
参考文章,拓展阅读:
http://blog.youkuaiyun.com/hguisu/article/details/6155636
http://lavasoft.blog.51cto.com/62575/18920/
个人能力有限,如有错误,恳请不吝赐教,谢谢