11-异常

异常: 指的是程序在执行过程中,出现的非正常的情况 ,导致程序执行失败。

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此类工具中编写代码的时候会有自动的提示。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容