Java——异常处理,
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()); //输出异常描述信息
}
}
}
相关文章
- 暂无相关文章
用户点评