情形一:catch中抛出异常,让调用方来处理
1 public class HelloWorld { 2 public static void main(String []args) { 3 System.out.println("Hello World!"); 4 String c = "wo"; 5 try{ 6 c = test(); // "wo" 7 }catch(Exception e){ 8 e.printStackTrace(); 9 } 10 System.out.println(c); // "wo" 11 } 12 public static String test() throws Exception{ 13 int a = 10; 14 int b = 0; 15 try{ 16 System.out.print("前"); 17 int d = a/b; 18 return "hello"; // 不执行 19 }catch(Exception e){ 20 System.out.print("后"); 21 throw new Exception("有问题"); //函数结束,抛出异常 22 } 23 //return "默认值"; 24 } 25 }
注解:
1、因为throw会直接抛出错误,后面语句不会再执行,所以不能写第23行。
2、因为异常发生在17行(int d = a/b;),所以17行之前代码还是会生效,之后的代码则不会执行,直接进入catch中;
3、第6行(c = test();),c的值并没有被函数test修改成功,此时c="wo"。
情形二:catch中不抛异常,直接处理
public class HelloWorld { 2 public static void main(String []args) { 3 System.out.println("Hello World!"); 4 String c = "wo"; 5 try{ 6 c = test(); // "默认值" 7 }catch(Exception e){ 8 e.printStackTrace(); 9 } 10 System.out.println(c); // "默认值" 11 } 12 public static String test() throws Exception{ 13 int a = 10; 14 int b = 0; 15 try{ 16 System.out.print("前"); 17 int d = a/b; 18 return "hello"; // 不执行 19 }catch(Exception e){ 20 System.out.print("后"); 21 //throw new Exception("有问题"); 22 } 23 return "默认值"; 24 } 25 }
注解:
1、因为函数是有返回类型(String),所以在没有第21行的情形下,没有第23行就会报错。此函数必须要有返回值(必须有第23行)。
2、函数test()有返回值,此时c="默认值",已经被函数test修改。
3、因为test方法没有抛出异常,所以调用方main函数不需要try-catch,代码可以改写成如下形式:
public class HelloWorld { 2 public static void main(String []args) { 3 System.out.println("Hello World!"); 4 String c = "wo"; 6 c = test(); // "默认值" 10 System.out.println(c); // "默认值" 11 } 12 public static String test(){ 13 int a = 10; 14 int b = 0; 15 try{ 16 System.out.print("前"); 17 int d = a/b; 18 return "hello"; // 不执行 19 }catch(Exception e){ 20 System.out.print("后"); 22 } 23 return "默认值"; 24 } 25 }