异常处理
1、异常处理方式
-
try-catch方式
-
throws方式
throws + 异常类型,写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时出现异常,就会在异常处生成一个异常类的对象,此对象满足throws异常类型时,就会被抛出。异常后续的代码就不再执行。
2、两种异常处理方式区别
-
try-catch-finally
真正的将异常给处理掉了。
-
throws
只是将异常抛给了方法的调用者,并没有真正的将异常处理掉。
3、两种异常处理方式的选择
- 如果父类中被重写的方法没有用throws方式处理异常,则子类重写的方法也不能用throws处理异常,如果子类重写的方法中有异常,必须使用try-catch-finally的方式处理。
- 执行的方法a()中,先后调用了另外的几个方法,这几个方法时通过递进关系执行的。建议这几个方法的异常使用throws方式进行处理,而执行的方法a()可以使用try-catch-finally的方式处理。
4、手动抛出异常对象
-
手动抛出Exception类型异常
方法中手动抛出Exception类型异常,则方法中必须使用throws方式处理异常,且调用者必须对该异常进行处理,使用try-catch或者throws继续抛出此异常。
-
手动抛出RuntimeException类型异常
调用者不用对该运行时异常进行处理,程序运行时遇到异常后,自动抛出到控制台。
/** * 手动抛出异常 */ public class testException { public static void main(String[] args) { Student student = new Student(); try { student.addStudent(-1); } catch (Exception e) { //输出异常处理信息 System.out.println(e.getMessage()); } } } /** * 手动抛出Exception异常 */ class Student { private Integer age; public void addStudent(Integer age) throws Exception { if (age > 0) { this.age = age; } else { throw new Exception("年龄必须大于0"); } } } class testException2 { public static void main(String[] args) { Student2 student = new Student2(); student.addStudent(-1); } } /** * 手动抛出RuntimeException异常 */ class Student2 { private Integer age; public void addStudent(Integer age) { if (age > 0) { this.age = age; } else { throw new RuntimeException("年龄必须大于0"); } } }
5、自定义异常
自定义异常步骤:
- 继承于现有的异常类:RuntimeException、Exception等;
- 提供全局常量;
- 提供重载的构造器。
/**
* 自定义异常,继承Exception
*/
public class MyException extends Exception {
//网络通信传输时,标识该类唯一
static final long serialVersionUID = -3387516993124229948L;
public MyException() {
}
public MyException(String msg) {
//调用父类的构造方法处理
super(msg);
}
}