异常: 指的是程序在执行过程中,出现的非正常的情况 ,导致程序执行失败。
Java提供了专门的类来管理异常,所有的异常类都是从 java.lang.Exception 类继承的子类 。
例如如下代码程序就会产生异常:
int a = 10;
int b = 0;
int c = a/b; //此处会产生异常,分母不能为0
一、进行异常处理的基本语法
语法:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
举例:
try
{
int a = 10;
int b = 0;
int c = a/b;
}
catch(Exception ex) //出现异常进入到catch
{
System.out.println("程序出现异常,请联系管理员:135******54");
System.out.println("异常信息:" + ex.getMessage());
}
finally
{
System.out.println("感谢使用本程序!");
}
说明:
(1)程序主题,除法分母为0会产生异常,解决此问题可以使用if else判断除数是否为0来防止异常,但是程序员并不能预料到所有的异常,所以程序员可以通过异常处理机制来解决此问题。
(2)使用try代码块包含需要处理异常的代码。
(3)如果出现异常,程序进入catch代码块,在catch代码块中可以通过ex对象获取到异常相关的信息。
(4)不管是否出现异常,程序都会进入finally代码块,finally代码块不是必要的,逻辑如果不需要可以不写。
二、多重捕获异常
一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
如果代码发生异常,异常抛给第一个catch块 ,如果异常类型不匹配,异常抛给第二个代码块,如果异常类型不匹配,继续按照顺序抛给后面的代码块,知道异常被捕获或者通过所有的catch块。
常见的异常类型如下:
| 异 常 类 型 | 说 明 |
|---|---|
| Exception | 异常层次结构的父类 |
| ArithmeticException | 算术错误情形,如以零作除数 |
| ArrayIndexOutOfBoundsException | 数组下标越界 |
| NullPointerException | 尝试访问 null 对象成员 |
| ClassNotFoundException | 不能加载所需的类 |
| IllegalArgumentException | 方法接收到非法参数 |
| ClassCastException | 对象强制类型转换出错 |
| NumberFormatException | 数字格式转换异常,如把****"****abc****"****转换成数字 |
语法:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
举例:
try
{
//模拟算术错误
int a = 5/0;
//模拟数组下标越界
int[] arr = new int[]{10,20,30};
System.out.println(arr[3]);
//数字格式转换异常,如把"abc"转换成数字
int i = Integer.parseInt("abc");
System.out.println(i);
}
catch(ArithmeticException ex)
{
System.out.println("算术错误:"+ex.getMessage());
}
catch(ArrayIndexOutOfBoundsException ex)
{
System.out.println("下标越界:"+ex.getMessage());
}
catch(NumberFormatException ex)
{
System.out.println("数字格式转换:" + ex.getMessage());
}
catch(Exception ex)
{
System.out.println("其它类型异常:" + ex.getMessage());
}
finally
{
System.out.println("感谢使用本程序!");
}
说明:
(1)如果try中是如下代码,将进入第一个catch代码块。
int a = 5/0;
(2)如果try中是如下代码,将进入第二个catch代码块。
int[] arr = new int[]{10,20,30};
System.out.println(arr[3]);
(3)如果try中是如下代码,将进入第三个catch代码块。
int i = Integer.parseInt("abc");
System.out.println(i);
三、使用throws抛出异常
使用throws抛出异常,可以将异常给调用它的上一级去处理。
如果有一个方法,如下:
public static void divide() throws Exception //此处使用throws关键字抛出异常
{
int a = 10;
int b = 0;
int c = a/b;
}
在main中如果调用此方法,必须使用try...catch进行异常处理,或者在次抛出给main的上一级JVM去处理。
try{
divide();
}
catch (Exception e) {
System.out.println("异常:" + e.getMessage());
}
四、自定义异常
Java中不包含的异常类型,例如我们认为给性别赋值,只能是男或女,赋值其它内容就是一个异常,我们就可以将这种异常定义为一个自定义异常。
如果有一个方法,如下:
public static String GetSex() throws Exception
{
Scanner input = new Scanner(System.in);
System.out.println("请输入您的性别:");
String sex = input.nextLine();
if(!sex.equals("男") && !sex.equals("女"))
{
throw new Exception("性别异常");
}
else
{
return sex;
}
}
使用throw new Exception抛出一个自定义异常,throws Exception定义将此异常交给调用的上一级去处理。
在main方法中,必须对此自定义异常进行处理:
try
{
String sex = GetSex();
System.out.println("输入的性别为:" + sex);
}
catch(Exception ex)
{
System.out.println(ex.getMessage()); //此处打印内容,即为自定义异常中定义的"性别异常"
}
五、checked异常
checked异常:Java API抛出的异常,程序必须处理,不处理编译无法通过。
例如:我们要创建一个文件。
File file = new File("H:\\myfile\\test.txt");
file.createNewFile();
此程序编译会报错,必须使用异常处理才能编译通过,所以需要将代码修改如下:
File file = new File("H:\\myfile\\test.txt");
try {
file.createNewFile(); //此代码必须进行异常处理
} catch (IOException e) {
System.out.println("异常:" + e.getMessage());
}
说明:checked异常除了上述创建文件的异常处理之外,还有很多,一般在eclipse此类工具中编写代码的时候会有自动的提示。