异常处理入门知识

异常处理

什么是异常:是指在程序运行过程中所发生的不正常事件,他会中断正在运行的程序。

异常处理

  • 概念:java编程语言使用异常处理机制为程序提供了错误处理能力
  • 过程:程序中预先设置好对付异常的处理办法–程序运行–出现异常–对异常进行处理–处理完毕,程序继续运行
  • 手段:java的异常处理是通过5个关键字来实现的try、catch、finally、throw、throws
1.5个关键字的作用
  1. try 执行可能产生异常的代码

  2. catch捕获异常

  3. finnally无论是否发生异常,代码总能执行

  4. throws 声明方法可能要抛出的各种异常

  5. throw手动抛出异常

    2.try-catch语句的3种情况
  • try块中的所有语句正常执行完毕,不会发生异常,那么所有try-catch语句都将被忽略

    public void method(){
    	try{
    		//代码段(此处不产生异常)
    	}catch(Exception ex){
    		//对异常进行处理的代码段
    	}
    		//代码段
    }
    
  • try语句块执行过程中遇到异常,那么在try块中的其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,那相应的catch块将会被执行,然后执行try-catch后面的代码段.

    public void method(){
    	try{
    		//代码段1
    		//产生异常的代码段2
    		//代码段3
    	}catch(Exception ex){
    		//对异常进行处理的代码段
    	}
    		//代码段4
    }
    //执行代码段1--代码段2时进行捕获异常进入catch--执行代码4(不在执行代码段3)
    
  • 第三种情况:try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常不匹配,程序会中断

3.在catch块中处理异常
  • 加入用户自定义处理信息

    System.err.println(“出现错误:被除数和除数必须是整数,”)

  • 异常对象的常用处理方法

void printStackTrace() 输出异常的堆栈信息

String getMessage() 返回异常信息描述字符串,是printStrackTrace()输出信息的一部分

4.常见的异常类型

Exception 异常层次结构的父类

ArithmeticException 算数错误情形,如以零作除数

ArrayIndexOutOfBoundsException 数组下标越界

NullPointerException null指针异常

ClassNotFoundException 不能加载所需的类

IllegalArgumentException 对象强制类型转换出错

ClassCastException 对象强制类型转换出错

NumberFormatException 数字格式转换异常

5.多重catch块

一段代码可能会引发多种类型的异常,处理的两种方式:1.execption 2.多重catch块进行分别捕获

注意事项

  • 排列catch语句的顺序:先子类后父类
  • 发生异常时按顺序逐个匹配
  • 只执行第一个与异常类型匹配的catch语句

执行顺序:出现异常–从上至下匹配catch块–找到进入–执行try-catch块后的代码段

问题1:try-catch块中存在return语句,是否还执行finally块,如果执行
,说出执行顺序?

执行,try发生异常–产生异常对象–异常类型匹配–进入catch块–执行finally块–进入catch块

try-catch-finally块中,finally块中唯一不执行的情况是什么?

在try-catch块后加入finally块,是否发生执行异常都执行,唯情况为catch块中加入system.exit(1),强制退出虚拟机.

6.声明异常–throws

关键字throws声明某个方法可能抛出各种异常,throws可以同时声明多个异常,多个异常用逗号隔开

异常的处理方式

  • 调用者通过try-catch捕获并处理异常
  • 调用者通过throws继续声明异常,如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常
  • main()方法声明的异常将由java虚拟机来处理
7.throw抛出异常

除了系统自动抛出异常外,在编程过程中,我们往往遇到这样的情形:有些问题是系统无法自动发现并解决的,如年龄不在正常范围内、性别输入不是“男”或“女”等,此时需要程序员而不是系统来自行抛出异常,把问题提交给调用者去解决。

public class Person {
private String name ="";
private String sex ="男";
public void setSex(String sex) throws Exception{
	if("男".equals(sex)||"女".equals(sex)){
		this.sex=sex;
	}else{
		throw new Exception("性别必须是男或者女!");
	}
}
}
8.throw和throws的区别
  • 作用不同:throw用于在程序中抛出异常;throws用于声明在该方法体内抛出了异常
  • 使用位置不同:throw位于方法体内部,可以作为单独语句使用,throws必须跟在方法参数列表后面,不能单独使用
  • 内容不同:throw抛出一个异常对象,而且只能是一个,throws后面跟异常类,而且可以跟多个异常类
9.异常的分类

Object–Exception类和Error类的父类Throwable–Error、Exception

仅靠程序本身无法恢复的严重错误Error–AWTError ThreadDeath

由java应用程序抛出和处理的非严重错误Exception–RuntimeException、Checked异常,程序必须处理该异常 SQLException、ClassNotFoundException

运行时异常,不要求程序必须做出处理RuntimeException–ArithmeticException、NullPointerException、NumberFormatException

10.自定义异常

步骤:定义异常类–编写构造方法,继承父类的实现–实例化自定义异常对象–使用throw抛出

定义异常类的常用方法:继承Throwable类、继承Exception或者RuntimeException

public class MyException extends Exception {
	//无参构造
	public MyException(){	
	}
	//有参构造
	public MyException(String msg){	
		super(msg);
	}
	//抛出异常
	public void get(int i)throws MyException{
		if(i<0){
			throw new MyException("不能小于0");
		}
	}
	public static void main(String[] args) throws MyException {
		new MyException().get(-9);
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iS80Pqb-1601113614566)(C:\Users\aym\AppData\Roaming\Typora\typora-user-images\1601112455563.png)]

public class Person {
 	private String name;
 	private String sex;
 	private int age;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public int getAge() {
  return age;
 }
 //声明异常类型
 public void setAge(int age) throws Exception {
  if(age>=1&&age<=100){
   this.age=age;
  }else{
   //手动抛出异常(创建了异常对象,异常对象的类型要与声明的类型保持一致)
   throw new Exception("年龄必须在1-100岁之间!");
  }
 }
 
 public Person() {
  
 }
 public Person(String name, String sex, int age) throws Exception {
  this.name = name;
  this.sex = sex;
  this.setAge(age);
 }
}
测试类
public class Test {
 public static void main(String[] args) {
  //调用者捕获异常
  try {
   Person person=new Person("张三","男",0);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   System.out.println(e.getMessage());
  }
 }
}
11.异常处理的原则
  • 异常处理与性能
  • 异常只能用于非正常情况
  • 不要将过于庞大的代码块放在try中
  • 在catch中指定具体的异常类型
  • 需要对捕获的异常处理

小结:重点掌握异常处理的步骤,自定义异常处理的使用方法,通过在日常编写程序过程中去了解异常处理,同时,自定义异常在初学阶段不经常使用,但必须会基本的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值