/* * 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。 * 或者说,我处理不了,我就不处理了。 * 为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。 * * 格式: * throws 异常类名 * 注意:这个格式必须跟在方法的括号后面。 * * 注意: * 尽量不要在main方法上抛出异常(因为这样就没有意义了)。 * 但是我讲课为了方便我就这样做了(将来实际开发中是弹出页面)。 * * 小结: * 编译期异常的抛出,将来调用者必须处理。 * 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。。 */
示例代码如下:
1 package cn.itcast_05;
2
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.Date;
6
7 /*
8 * 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。
9 * 或者说,我处理不了,我就不处理了。
10 * 为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。
11 *
12 * 格式:
13 * throws 异常类名
14 * 注意:这个格式必须跟在方法的括号后面。
15 *
16 * 注意:
17 * 尽量不要在main方法上抛出异常(因为这样就没有意义了)。
18 * 但是我讲课为了方便我就这样做了(将来实际开发中是弹出页面)。
19 *
20 * 小结:
21 * 编译期异常的抛出,将来调用者必须处理。
22 * 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。。
23 */
24 public class ExceptionDemo {
25 public static void main(String[] args) {
26 System.out.println("今天天气很好");
27 try {
28 method(); // 调用者也可以继续再把异常抛出给main函数,即把异常抛给虚拟机了,虚拟机会进行异常默认处理,同时将程序停止运行,可是这个方案这不是我想要的!
29 } catch (ParseException e) {
30 e.printStackTrace();
31 }
32 System.out.println("但是就是不该有雾霾");
33
34 method2(); // 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。
35 }
36
37 // 运行期异常的抛出(其实运行期异常是不需要抛出的,但是为了演示我依然抛出来,尽管我抛出来了,你调用者可以处理也可以不处理)
38 public static void method2() throws ArithmeticException {
39 int a = 10;
40 int b = 0;
41 System.out.println(a / b);
42 }
43
44 // 编译期异常的抛出
45 // 在方法声明上抛出,是为了告诉调用者,你注意了,调用这个方法时可能会有问题,又因为是编译期异常,所以调用者必须要处理,否则编译通不过。
46 public static void method() throws ParseException {
47 String s = "2014-11-20";
48 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
49 Date d = sdf.parse(s); // 编译期异常,可以不在方法上进行声明,直接用try...catch对该句进行处理;也可以在方法声明上抛出异常声明,让调用者去用try...catch进行处理。
50 System.out.println(d);
51 }
52 }
程序运行结果为:
今天天气很好
java.text.ParseException: Unparseable date: "2014-11-20"
at java.base/java.text.DateFormat.parse(DateFormat.java:388)
at cn.itcast_05.ExceptionDemo.method(ExceptionDemo.java:49)
at cn.itcast_05.ExceptionDemo.main(ExceptionDemo.java:28)
但是就是不该有雾霾
Exception in thread "main" java.lang.ArithmeticException: / by zero
at cn.itcast_05.ExceptionDemo.method2(ExceptionDemo.java:41)
at cn.itcast_05.ExceptionDemo.main(ExceptionDemo.java:34)
/* * throw:如果在功能方法内部出现了异常情况,程序不能继续运行,需要进行跳转时,我们可以把该异常抛出,这个时候的抛出的是该异常的对象。 * * throws和throw的区别(面试题) throws 用在方法声明后面,跟的是异常类名, 可以跟多个异常类名,用逗号隔开, 表示抛出异常,由该方法的调用者来处理, throws表示出现异常的一种可能性,并不一定会发生这个异常。 throw 用在方法体内,跟的是异常对象名, 只能抛出一个异常对象名, 表示抛出异常,由方法体内的语句处理, throw则是抛出了异常,执行throw则一定抛出了某种异常。 * */
示例代码如下:
1 package cn.itcast_06;
2
3 /*
4 * throw:如果在功能方法内部出现了异常情况,程序不能继续运行,需要进行跳转时,我们可以把该异常抛出,这个时候的抛出的是该异常的对象。
5 *
6 throws和throw的区别(面试题)
7 throws
8 用在方法声明后面,跟的是异常类名,
9 可以跟多个异常类名,用逗号隔开,
10 表示抛出异常,由该方法的调用者来处理,
11 throws表示出现异常的一种可能性,并不一定会发生这个异常。
12 throw
13 用在方法体内,跟的是异常对象名,
14 只能抛出一个异常对象名,
15 表示抛出异常,由方法体内的语句处理,
16 throw则是抛出了异常,执行throw则一定抛出了某种异常。
17 *
18 */
19 public class ExceptionDemo {
20 public static void main(String[] args) {
21 // method(); // 运行期异常,用throw抛出,我们没有做处理,则会使用JVM的异常默认处理机制:即将该异常进行处理,将该异常的名称、异常的信息和异常出现的位置打印在了控制台上,同时将程序停止运行。
22 // 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。
23 try {
24 method2(); // 编译期异常的抛出,将来调用者必须处理(前提是这个异常要在方法上声明抛出给调用者,如果你直接在方法里就处理,那跟调用者就没有关系了)。
25 } catch (Exception e) {
26 e.printStackTrace();
27 }
28
29 System.out.println("over");
30 }
31
32 // throw是在方法功能内部抛出异常的对象,若是运行期异常,一般不用在方法上进行声明(也可以声明哦,但不管你声不声明,作为调用者可以处理也可以不处理)
33 public static void method() {
34 int a = 10;
35 int b = 0;
36 if (b == 0) {
37 throw new ArithmeticException(); // 运行期异常,使用JVM的一个默认的异常处理机制:即将该异常进行处理,将该异常的名称、异常的信息和异常出现的位置打印在了控制台上,同时将程序停止运行。
38 } else {
39 System.out.println(a / b);
40 }
41 }
42
43 // throw是在方法功能内部抛出异常的对象,若是编译期异常,一般在方法上进行声明,交给调用者处理
44 public static void method2() throws Exception {
45 int a = 10;
46 int b = 0;
47 if (b == 0) {
48 throw new Exception(); // 编译期异常,这是一条正常的语句,而该正常的语句出现了编译期异常,必须要处理否则编译就不通过。
49 } else { // 可以不在方法上进行声明,直接用try...catch对该句进行处理;也可以在方法声明上抛出异常声明,让调用者去用try...catch进行处理。
50 System.out.println(a / b);
51 }
52 }
53 }
程序运行结果为:
java.lang.Exception
at cn.itcast_06.ExceptionDemo.method2(ExceptionDemo.java:48)
at cn.itcast_06.ExceptionDemo.main(ExceptionDemo.java:24)
over