学习目标:
掌握异常学习内容:
1、 finally 2、 throws 3、 throw 4、 自定义异常学习时间:
2021年6月6日学习产出:
1、 技术笔记 1 遍 2、CSDN 技术博客 2 篇Finally
try {
可能出现异常的代码
}catch(异常类型 e 用来接收抛出的异常对象){
捕获处理发生的异常
}finally{
无论是否出现异常,代码都会执行
}
后续程序继续执行
如果没有catch:try+finally 一旦出现异常,会执行finally ,之后程序崩掉了
throws
throws,定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。
任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
子类重写父类中的方法,子类方法不能声明抛出比父类类型更大的异常(针对编译期异常)。
public abstract class ExceptionDemo4 {
abstract void eat() throws Exception;
}
public class Demo extends ExceptionDemo4 {
/*
方法重写父类方法
返回值,方法名,参数必须一样
访问权限修饰符 大于等于父类方法权限
声明的异常必须小于或等于父类声明的异常
*/
@Override
public void eat() throws UnsupportedEncodingException,Exception {
}
}
使用了throws的方法,调用时必须处理声明的异常,要么使用try-catch,要么继续使用throws声明。
public static void main(String[] args) {
try {
test1();
} catch (UnsupportedEncodingException e) {
System.out.println("编码不支持");
}catch (ParseException p){
System.out.println("日期解析异常");
}catch (NullPointerException n){
System.out.println("对象为空");
}
System.out.println("aaaaa");
}
public static void test1() throws UnsupportedEncodingException, ParseException {
test2();
}
public static void test2() throws UnsupportedEncodingException, ParseException {
test3();
}
/*
throws NullPointerException 运行时异常 声明为运行时异常,方法调用处可以处理也可以不处理
UnsupportedEncodingException 声明为编译期异常,那么调用在编译期间必须处理
一般情况下,throws后面一般都声明的是编译期异常明抛出
一般情况下,位于底层的方法都选择向上声
*/
public static void test3() throws NullPointerException, UnsupportedEncodingException, ParseException {
String s = "中国";
s.getBytes("gbk");
SimpleDateFormat sdf = new SimpleDateFormat("");
sdf.parse("");
}
throw
throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实 例化对象。
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
public static void main(String[] args) {
//System.out.println(10/0);//由虚拟机在运行时出现异常,抛出一个此类的对象
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.ff.javaexception.day2.ExceptionDemo5.main(ExceptionDemo5.java:7)
*/
try {
subFileType(null);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public static String subFileType(String fileName){
if(fileName==null){
//在方法体中,主动显示的抛出一个对用的异常对象,告知(通知)方法调用处,传入的数据有问题
throw new NullPointerException("文件名为null了");
}
return fileName.substring(fileName.lastIndexOf(".")+1);
}
throws和throw
throw用于方法体中,用来抛出一个实际的异常对象,使用throw后,要么使用try catch捕获异常,要么使用throws声明异常 。
throws用于方法声明处,用来声明该方法可能发生的异常类型,可以是
多个异常类型,用来强制调用该方法时处理这些异常。
抽象方法也可以使用throws。
自定义异常
作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆。
基本语法 :
public class 异常类名 extends Exception/RuntimeException{
public 异常类名(String msg){
super(msg);
}
}
自定义异常类中往往不写其他方法,只重载需要使用的构造方法
继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或
throws抛出。
/*
自定义异常类
分数异常类
*/
public class ScoreException extends Exception{
public ScoreException() {
super();
}
public ScoreException(String msg) {
super(msg);
}
}
public class Test {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList(3);
arrayList.add(11);
arrayList.add(11);
arrayList.add(11);
arrayList.add(11);
try {
score(-10);
} catch (ScoreException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
public static String score(double score) throws ScoreException {
if(score<0){
throw new ScoreException("分数小于0了");
}
if(score>100){
throw new ScoreException("分数大于100了");
}
if(score>=90){
return "A";
}
return "D";
}
}