Java-异常

异常

  • java异常结构定义有Throwable类,Exception和Error是其派生的两个子类。
    检查性异常类,则需要继承 Exception 类。
    运行时异常类,那么需要继承 RuntimeException 类。

  • 异常发生的原因有很多,通常包含以下几大类:
    用户输入了非法数据。
    打开的文件不存在。
    网络通信时连接中断,或者JVM内存溢出。

  • 异常处理机制之:try-catch

  1. 语法:
try{
	代码片段
}catch(XXXException e){
	try中出现XXXException后的处理代码
}catch(XXXException e){
	异常处理语句
}finally{
	程序代码
}
  1. 注意:
    try语句块中出错代码以下的内容都不会执行
    finally中的代码不管有没有异常都会执行。
    通常我们将无关乎报错,但是都必须执行的代码放在这里确保运行。比如IO操作后的关闭流
    Exception可以避免因为一个未处理的异常导致程序中断
  2. 示例:
System.out.println("程序开始了");
try{
	String str = "";
	System.out.println(str.length()); //0
	return;
}catch(Exception e) {
	System.out.println("异常");
}finally {
	System.out.println("finally语句执行了");----------就算try中有returnfinally也是会执行的
}
System.out.println("程序结束了");
/*
输出的结果是:
	程序开始了
	0
	finally语句执行了
*/
  1. 示例:IO文件操作异常标准写法
/** 在IO中使用异常处理机制 */
public class FinallyDemo {
	public static void main(String[] args) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("fos.dat");
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(fos!=null) {
					fos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

以上程序简化:JDK7之后推出了一个新特性:autocloseable,自动关闭特性

// JDK7之后推出了一个新特性:autocloseable,自动关闭特性(将需要关闭的IO写在小括号里)
try(FileOutputStream fos = new FileOutputStream("fos.dat")){
	fos.write(1);
}catch(Exception e) {
	e.printStackTrace();
}

注意:只有实现了AutoCloseable接口的类才可以在这里初始化,并且编译器会将它们在finally中调用close方法关闭

   

分别说明final finally finalize

  • final是关键字,可以定义在类中(不能被继承),方法中(不能被重写),常量中(static final表示常量)
  • finally是异常处理机制(try…catch…finally)
  • finalize是Object定义的方法,当GC在释放一个对象前会调用该方法,调用后该对象即被释放

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。
这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。
子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的

   

finally示例

public static void main(String[] args) {
	System.out.println(test("0")+","+test(null)+","+test(""));
}
public static int test(String str) {
	try {
		return str.charAt(0)-'0';
	} catch (NullPointerException e) {
		// 空指针异常
		return 1;
	}catch(Exception e) {
		// 如果str是""则会发生越界
		return 2;
	}finally {
		return 3;
	}
}

// 输出结果是3,3,3    如果没有finally语句:输出是0,1,2

   

throw关键字

异常的抛出

  • throw关键字用于主动抛出一个异常。以下两种情况我们通常会主动抛出异常:
  1. 满足语法要求但是不满足业务逻辑要求
    例如:人的年龄int age语法可以写10000岁,但是业务逻辑不满足(0-100岁)

  2. 当前代码片段出现了异常,但是该异常不应当在代码片段被解决时可以对外抛出。

  • 当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,处理方式两种:
  1. 在当前方法上继续使用throws声明该异常的抛出

  2. 使用try-catch主动捕获并处理
    (具体使用哪种取决于处理异常的责任问题)

  3. 当一个方法使用throw主动对外抛出一个异常时,通常我们需要在方法声明这里使用throws声明该异常的抛出。
    只有RuntimeException抛出时可以不声明,其他异常则是必须声明的
    示例:

public void setAge(int age) throws Exception{
	if(age<0 || age>100) {
		throw new Exception("年龄不合法");
	}
	this.age = age;
}
  • 当我们需要重写一个含有throws声明异常抛出的方法时,对于throws的重写规则
    1. 允许throws异常全部抛出
    2. 允许不抛出任何异常
    3. 允许抛出部分异常
    4. 允许抛出父类方法抛出异常的子类型异常(新异常必须是继承了父类的异常.比如FileNotFoundException extends IOException)
    5. 不允许抛出额外异常
    6. 不允许抛出父类方法抛出异常的父类型异常

   

异常中常用的方法

System.out.println("出错了");
// 输出错误堆栈信息
e.printStackTrace();
// 获取错误消息
String message = e.getMessage();
System.out.println(message);

   

自定义异常:

  • 自定义异常通常用来说明业务逻辑级别的错误,这些问题通常java是没有提供现成的异常
  • 自定义异常创建需要以下操作:
    1. 定义一个类,名字要做到见名知义
    2. 需要继承Exception(直接或间接继承均可)
    3. 提供所有构造方法(Exception提供的)

示例:
(下面都是eclipse编译器sourse–General Constract from Subclass自动生成的)

package exception;

/** 非法年龄异常 */
public class IllegalAgeException extends Exception{

	private static final long serialVersionUID = 1L;

	public IllegalAgeException() {
		super();
	}

	public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
	}

	public IllegalAgeException(String message, Throwable cause) {
		super(message, cause);
	}

	public IllegalAgeException(String message) {
		super(message);
	}

	public IllegalAgeException(Throwable cause) {
		super(cause);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值