异常问题
异常笔记
1.1异常的概念
不正常,我们在代码的时候出现的变异或者运行时的错误。
1.2为什么出现异常
Java它为我们提供异常处理机制,可以找到异常位置,错误的类型,错误的原因,方便我们处理异常。
1.3异常的体系结构
Throwable(最顶层)
Error:出现的不可能处理的严重问题
Exception:可以处理的问题
1.4异常的处理方式
1.4.1不处理
如果我们不处理异常,jvm会处理,将异常的位置,类型,原因信息显示到console控制台中,还会把我们的程序终止。
1.4.2我们处理
1)捕获异常
try…catch语句
Try {
有可能出现问题的代码;
} catch(异常对象) {
处理异常;
}
Try…catch的执行顺序:
执行try语句
如果发现异常,异常下面的代码不在执行,直接跳入catch语句,catch语句结束后,整个try。。Catch结束,如果没有发现异常,try语句执行结束之后,catch语句不再执行。
2)抛出异常
我们不想处理异常,或者没有能力处理异常的时候,我们可以选择抛出异常,谁调用方法谁处理异常。
使用关键字throws,在方法声明之后抛出。
1.5如何处理多个异常
1.5.1解决方法:
第一种:可以使用多个try…catch语句,分别包含异常代码。
第二种:可以使用try…catch…catch…catch…语句,try中包含多个异常代码块,每个catch包含一种异常。
第三种:使用try…catch(Exception e)…
1.5.2多个catch之间的顺序:
多个catch之间可以子父类关系
同级之间没有顺序关系
如果有子父类,父类异常必须放在后面。
1.5.3常见异常
RuntimeException:
1)NullPointerException:空指针异常
一个引用对象的值为null,这时调用他的成员变量或者方法,就会出现空指针异常。
2)IndexOutOfException:下标越界异常
3)ArithmeticException:运算异常
4)ClassNotFoundException:类找不到异常(jar包没等)
5)NuberFormateException:数字格式异常
非RuntimeException
1)IOException: io异常
2)SQLException:SQL语句异常
1.6Throwable的常用方法
常用方法:
String getMessage():原因
String toString():类型和原因
Void printStackTrace():类型原因位置
1.7finally的应用
Try {
有可能出现问题的代码;
} catch(异常对象) {
处理异常;
} finally {
释放资源;
清理垃圾;
}
组合try…catch语句使用,用于释放资源等收尾工作,无论try…catch语句如何执行,finally的代码一定会执行。
1.8异常的分类
1.8.1运行时期异常
RuntimeException的子类就是运行时期异常,在编译时期可以自由选择处理或者不处理。
1.8.2编译时期异常
在编译时期必须处理。
1.9自定义异常
1.9.1案例需求:
写一个方法,接收考试成绩,如果考试范围在0-100之间则属于正常,否则属于异常。
异常抛出成绩不符合要求
1)编译时期异常
2)运行时期异常
1.9.2为什么需要自定义异常:
使用自定义异常,可以更加直观的的看出我们自己想要抛出的信息,可以通过跑出的信息区分异常发生的位置,根据异常名我们就知道哪里有一场,根据异常信息进行程序修改。
1.9.3Throws和throw的区别:
Throws:处理异常的一种方式,把异常抛出,由调用者来处理。
Throw:制造异常的方式,碰到异常直接终止程序。
1.9.4注意:
编译时期异常必须要抛出异常。
1.9.5如何自定义一个异常类:
写一个类去继承Exception或者RuntimeException,然后实现多个构造。
1)自定义一个类。
2)如果希望写一个编译时异常(检查性异常类),则需要继承Exception类。
3)如果希望写一个运行时异常类,那么需要继承RuntimeException类。
4)自定义异常类需要重写父类的两个构造方法,分别是无参构造和有一个String的有参构造。
1.10代码
1.10.1编写运行时异常
package com.aaa.exception;
@SuppressWarnings("serial")
public class ScoreOutOfRantimeException extends RuntimeException{
public ScoreOutOfRantimeException() {
super();
// TODO Auto-generated constructor stub
}
public ScoreOutOfRantimeException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
测试类测试运行时异常
//测试类测试运行时异常
package com.aaa.test;
import com.aaa.exception.ScoreOutOfRantimeException;
public class ScoreTest {
public static void main(String[] args) {
double score = -10;
if(score < 0 || score > 100) {
//抛出异常,用关键字throw+new+异常名(异常原因);
throw new ScoreOutOfRantimeException("分数格式错误!!!");
} else {
System.out.println("分数格式正确!!!");
}
}
}
结果
1.10.2编写编译时异常
package com.aaa.exception;
@SuppressWarnings("serial")
public class ScoreOutOfNotRuntimeException extends Exception{
public ScoreOutOfNotRuntimeException() {
super();
// TODO Auto-generated constructor stub
}
public ScoreOutOfNotRuntimeException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
测试编译时异常
注意:如果抛出编译时期异常,必须要处理。
package com.aaa.test;
import com.aaa.exception.ScoreOutOfNotRuntimeException;
public class ScoreTest {
public static void main(String[] args) {
//调用方法
try {
inputScore(1000);
} catch (ScoreOutOfNotRuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 编写判断分数是否合格方法
* @param score
* @throws ScoreOutOfNotRuntimeException
*/
public static void inputScore(double score) throws ScoreOutOfNotRuntimeException {
if(score < 0 || score > 100) {
//抛出异常,用关键字throw+new+异常名
throw new ScoreOutOfNotRuntimeException("分数格式不正确");
} else {
System.out.println("分数格式正确!!!");
}
}
}
注意:如果是抛出编译时期异常,方法头部必须要抛出。