Java——异常处理

1.Java中常见的异常如下表所示:

2.异常处理

在Java语言中,若某个方法抛出异常,既可以在当前方法中进行捕获,然后处理该异常,也可以将异常向上抛出,由方法的调用者来处理。

一、(1)使用try…catch语句

一般格式格式为:

实例:将字符串“24L"转换为integer类型,并捕获转换中产生的数字格式异常
try{
    int age=Integer.parseInt("24L"); 	//抛出NumberFormatException异常
     System.out.println("打印1");
}catch(NumberFormatException e){	//捕获NumberFormatException异常
    System.out.println("年龄请输入整数!");
    System.out.println("错误:"+e.getMessage());  //getMessage()方法获取对异常的描述信息。
}
System.out.println("打印2");

 

因为程序执行到“Integer.parseInt("24L")”时抛出异常,直接被catch语句捕获,程序流程跳转到catch语句块内继续执行,所以“System.out.println("打印1")”代码行不会被执行;而异常处理结束后,会继续执行try…catch语句后面的代码,所以“打印2”行代码执行。

说明:若不知代码抛出的是哪种异常,可指定它们的父类Exception。

(2)在try…catch语句中,可以同时存在多个catch语句块。

一般格式为:

二、finally子句的用法

finally子句需要与try…catch语句一同使用,不管程序中有无异常发生,并且不管之前的try…catch是否顺利执行完毕,最终都会执行finally语句块中的代码,这使得一些不管在任何情况下都必须执行的步骤被执行,从而保证了程序的健壮性。

三、使用throws关键字抛出异常

若某个方法可能会发生异常,但不想在当前方法中来处理这个异常,那么可以将该异常抛出,然后在调用该方法的代码中捕获该异常并进行处理。

将异常抛出,可通过throws关键字来实现。throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可用逗号分隔。

实例:dofile()方法声明抛出一个IOException异常,在该方法的调用者main()方法中需要捕获该异常并进行处理。
public class Demo {
	public static void main(String[] args){
		try{			
			dofile("C:/mytxt.txt");
		}catch(IOException e){
			System.out.println("调用dofile()方法出错!");
			System.out.println("错误:"+e.getMessage());
		}
	}
	public static void dofile(String name) throws IOException{
		File file=new File(name);					//创建文件
		FileWriter fileOut=new FileWriter(file);
		fileOut.write("Hello!world!");				//向文件中写入数据
		fileOut.close();							//关闭输出流
		fileOut.write("爱护地球!");				//运行出错,抛出异常
	}
}

四、使用throw关键字

使用throw关键字也可抛出异常,与throws不同的是,throw用于方法体内,并且抛出一个异常类对象,而throws用在方法声明中来指明方法可能抛出的多个异常。

通过throw抛出异常后,如果想由上一级代码来捕获并处理异常,则同样需要在抛异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果想在当前的方法中捕获并处理throw抛出的异常,则必须使用try…catch语句。上述两种情况,若throw抛出的异常是Error、RuntimeException或它们的子类,则无须使用throws关键字或try…catch语句。

当输入的年龄为负数时,Java虚拟机当然不会认为这是一个错误,但实际上年龄是不能为负数的,可通过异常的方式来处理这种情况。

实例:
check()方法首先将传递进来的String型参数转换为int型,然后判断该int型整数是否为负数,若为负数则抛出异常;然后在该类的main()方法中捕获异常并处理。

public static int check(String strage) throws Exception {
		int age = Integer.parseInt(strage); // 转换字符串为int型
		if (age < 0) // 如果age小于0
			throw new Exception("年龄不能为负数!"); // 抛出一个Exception异常对象
		return age;
	}

	public static void main(String[] args) {
		try {
			int myage = check("-101"); // 调用check()方法
			System.out.println(myage);
		} catch (Exception e) { // 捕获Exception异常
			System.out.println("数据逻辑错误!");
			System.out.println("原因:" + e.getMessage());
		}
	}

注意事项:①在try语句块中声明的变量是局部变量,只在当前try语句块中有效,在其后的catch、finally语句块或其他位置都不能访问该变量。

②对于发生的异常,必须使用"try····catch"语句捕获,或通过throws向上抛出,否则编译出错。

③在使用throw语句抛出一个异常对象时,该语句后面的代码将不会被执行。

3.自定义异常

自定义异常类大体可分为以下几个步骤。

(1)创建自定义异常类。

(2)在方法中通过throw抛出异常对象。

(3)若在当前抛出异常的方法中处理异常,可使用try…catch语句捕获并处理;否则在方法的声明处通过throws指明要抛出给方法调用者的异常,继续进行下一步操作。

(4)在出现异常的方法调用代码中捕获并处理异常。

如果自定义的异常类继承自RuntimeExeption异常类,在步骤(3)中,可以不通过throws指明要抛出的异常。

实例:
在编写程序过程中,如果希望一个字符串的内容全部是英文字母,若其中包含其他的字符,则抛出一个异常。因为在Java内置的异常类中不存在描述该情况的异常,所以需要自定义该异常类。
(1)创建MyException异常类
public class MyException extends Exception { //继承Exception类
	private String content;
	public MyException(String content){		//构造方法
		this.content=content;
	}
	public String getContent() {	//获取描述信息
		return this.content;
	}
}
(2)创建Example类,在类中创建一个带有String型参数的方法check(),该方法用来检查参数中是否包含英文字母以外的字符。若包含,则通过throw抛出一个MyException异常对象给check()方法的调用者main()方法
public class Example {
	public static void check(String str) throws MyException{//指明要抛出的异常
		char a[]=str.toCharArray();		//将字符串转换为字符数组
		int i=a.length;
		for(int k=0;k<i-1;k++){		    //检查字符数组中的每个元素
			//如果当前元素是英文字母以外的字符
			if(!((a[k]>=65&&a[k]<=90)||(a[k]>=97&&a[k]<=122))){
				//抛出MyException异常类对象
				throw new MyException("字符串\""+str+"\"中含有非法字符!");
			}
		}
	}
	public static void main(String[] args) {
		String str1="HellWorld";
		String str2="Hell!MR!";
		try{
			check(str1);		//调用check()方法
			check(str2);       //执行该行代码时,抛出异常
		}catch(MyException e){	//捕获MyException异常
			System.out.println(e.getContent());	//输出异常描述信息
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值