异常
不是错误,异常是不正常事件!有可能会发生有可能不会发生!!
1.异常和错误区别:
错误:程序员无法通过代码处理。例如:内存溢出
异常:有可能会发生的情况,程序员可以通过程序进行处理,让程序即使遇到异常也可以继续执行。例如:除数为0,
2.异常体系:
Throwable Exception类、Error类
2.1 Exception(运行期异常)
程序运行时抛出的异常,一般都是由于程序设计的漏洞,一旦发生,直接由虚拟机终止正在运行的程序:
数学异常
数组下标越界异常
输入不匹配异常
空指针异常NullPointer
…
以上这些异常,都是RuntimeException的子类
2.2 编译期异常
除去运行期异常都是编译异常:
IOException
SQLException
异常与说明
3.异常处理机制
当异常发生的时候,我们要进行一些操作,可以让让程序能够继续向下执行,因此我们需要进行异常处理。
try catch finally throws throw
3.1语法和使用
try{
//可能会发生异常的代码块
}catch(异常捕获){
//异常发生时处理的代码
}finally{
//无论是否发生异常,都会执行的代码
}
Scanner input = new Scanner(System.in);
try{
System.out.print("请输入一个整数:");
int num1 = input.nextInt();
System.out.print("请输入一个整数:");
int num2 = input.nextInt();
int result = num1 / num2;
System.out.println("结果:" + result);
}catch(ArithmeticException ex){//异常捕获
System.out.println("除数不能0");
}finally{
System.out.println("程序结束");
}
System.out.println("程序是否终止");
注意:
必须有try ; catch可以有1个或者多个; finally最多1个,可以没有!
3.2 catch捕获多个异常
Scanner input = new Scanner(System.in);
try{
System.out.print("请输入一个整数:");
int num1 = input.nextInt();
System.out.print("请输入一个整数:");
int num2 = input.nextInt();
int result = num1 / num2;
System.out.println("结果:" + result);
}catch(ArithmeticException ex){//异常捕获
System.out.println("除数不能0");
}catch (InputMismatchException ex) {
System.out.println("输入不匹配");
}catch (Exception ex) {
System.out.println("异常发生");
}finally{
System.out.println("程序结束");
}
System.out.println("程序是否终止");
注意:
1.多个catch排列-先子类后父类,同类无先后。
2.发生异常按照顺序逐个匹配,只执行第一个匹配的异常
3.finally块无论是否发生都要执行的语句
4.finally遇到return也正常执行
Scanner input = new Scanner(System.in);
try{
System.out.print("请输入一个整数:");
int num1 = input.nextInt();
System.out.print("请输入一个整数:");
int num2 = input.nextInt();
int result = num1 / num2;
System.out.println("结果:" + result);
return;
}catch (Exception ex) {
System.out.println("异常发生");
}finally{
System.out.println("程序结束");
}
System.out.println("程序是否终止");
/*
* 请输入一个整数:9
请输入一个整数:5
结果:1
程序结束
请输入一个整数:9
请输入一个整数:0
异常发生
程序结束
程序是否终止
*/
5.finally遇到System.exit(0)不会执行
Scanner input = new Scanner(System.in);
try{
System.out.print("请输入一个整数:");
int num1 = input.nextInt();
System.out.print("请输入一个整数:");
int num2 = input.nextInt();
int result = num1 / num2;
System.out.println("结果:" + result);
System.exit(0);
}catch (Exception ex) {
System.out.println("异常发生");
}finally{
System.out.println("程序结束");
}
System.out.println("程序是否终止");
/*
* 请输入一个整数:9
请输入一个整数:3
结果:3
*/
总结:
finally只有遇到System.exti(0)才会不执行!!
4.处理异常方式
4.1 自定义控制台输出
System.out.print("输入不匹配");
4.2 打印堆栈信息
.....
catch (Exception ex) {
ex.printStackTrace();
}
.....
堆栈信息:异常类型 异常内容字符串 异常位置
4.3 输出错误信息
.....
catch (Exception ex) {
System.out.println(ex.getMessage());/// by zero
}
.....
4.4 throws
定义方法上,方法体中如果发生异常,那么由调用者去处理。
总结:
1.任何方法都可以使用throws(抽象方法可以)。
2.子类覆盖父类的方法,子类方法不能声明抛出比父类范围大的异常类型。
3.throws可以声明多种异常类型,用逗号分隔。
4.5 throw
(1)语句抛出异常
String str="abc";
if(str.equals("abc")){
throw new NumberFormatException();
}else{
System.out.println(str);
}
System.out.println("程序终止");
(2)自定义异常
public class Student {
private String stuNo;
private String stuName;
private String sex;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) throws Exception{
if(sex.equals("男")||sex.equals("女")){
this.sex=sex;
}else{
//自定义异常
throw new Exception("性别只能是男或者女");
}
}
@Override
public String toString() {
return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", sex=" +
sex + "]";
}
}
自定义异常,定义异常名字和内容
第一:建立SexException类
第二:使用异常进行操作
第三:调用处理异常方法
public static void main(String[] args) {
Student stu=new Student();
stu.setStuNo("1001");
stu.setStuName("小红");
try {
stu.setSex("好");
} catch (Exception e) {
e.printStackTrace();
}
}