📜  Java中的异常类型与示例

📅  最后修改于: 2020-04-04 09:43:40             🧑  作者: Mango

Java定义了几种与其各种类库相关的异常类型。Java还允许用户定义自己的异常。
内置异常是Java库中可用的异常。这些异常适用于解释某些错误情况。以下是Java中重要的内置异常列表。

  1. ArithmeticException
    当在算术运算中发生异常情况时引发。
  2. ArrayIndexOutOfBoundsException
    抛出该异常以指示已使用非法索引访问了数组。索引为负或大于或等于数组的大小。
  3. ClassNotFoundException
    当我们尝试访问未找到其定义的类时引发此异常
  4. FileNotFoundException
    当无法访问或无法打开文件时,引发此异常。
  5. IOException
    当输入输出操作失败或中断时引发
  6. InterruptedException
    当线程正在等待,睡眠或进行某些处理时抛出,并被中断。
  7. NoSuchFieldException
    当类不包含指定的字段(或变量)时引发
  8. NoSuchMethodException
    在访问未找到的方法时引发。
  9. NullPointerException
    引用空对象的成员时引发此异常,空代表什么都没有。
  10. NumberFormatException
    当方法无法将字符串转换为数字格式时,引发此异常。
  11. RuntimeException
    这表示运行时发生的任何异常。
  12. StringIndexOutOfBoundsException
    String类方法抛出该异常,以指示索引比字符串的大小大

内置异常的示例:

  • 算术异常ArithmeticException
    // Java展示算术异常ArithmeticException
    class ArithmeticException_Demo
    {
        public static void main(String args[])
        {
            try {
                int a = 30, b = 0;
                int c = a/b;  // 不能除以0
                System.out.println ("结果 = " + c);
            }
            catch(ArithmeticException e) {
                System.out.println ("不能除以0");
            }
        }
    }

    输出:

    不能除以0
  • 空指针异常
    //Java程序展示NullPointerException
    class NullPointer_Demo
    {
        public static void main(String args[])
        {
            try {
                String a = null; //null值
                System.out.println(a.charAt(0));
            } catch(NullPointerException e) {
                System.out.println("NullPointerException..");
            }
        }
    }

    输出:

    NullPointerException..
  • StringIndexOutOfBound异常
    // Java展示StringIndexOutOfBoundsException
    class StringIndexOutOfBound_Demo
    {
        public static void main(String args[])
        {
            try {
                String a = "This is like chipping "; // 长度 22
                char c = a.charAt(24); // 获取第25个元素
                System.out.println(c);
            }
            catch(StringIndexOutOfBoundsException e) {
                System.out.println("StringIndexOutOfBoundsException");
            }
        }
    }

    输出:

    StringIndexOutOfBoundsException
  • FileNotFound异常
    //Java程序展示FileNotFoundException
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
     class File_notFound_Demo {
        public static void main(String args[])  {
            try {
                // 下面的文件不存在
                File file = new File("E://file.txt");
                FileReader fr = new FileReader(file);
            } catch (FileNotFoundException e) {
               System.out.println("文件不存在");
            }
        }
    }

    输出:

    文件不存在
  • NumberFormat异常
    // Java程序展示NumberFormatException
    class  NumberFormat_Demo
    {
        public static void main(String args[])
        {
            try {
                // "akki" 不是一个数字
                int num = Integer.parseInt ("akki") ;
                System.out.println(num);
            } catch(NumberFormatException e) {
                System.out.println("数字格式错误");
            }
        }
    }

    输出:

    数字格式错误
  • ArrayIndexOutOfBounds异常
    // Java程序,展示ArrayIndexOutOfBoundException
    class ArrayIndexOutOfBound_Demo
    {
        public static void main(String args[])
        {
            try{
                int a[] = new int[5];
                a[6] = 9; // 获取第7个元素
                          // 但array长度为5
            }
            catch(ArrayIndexOutOfBoundsException e){
                System.out.println ("Array的索引超出范围");
            }
        }
    }

    输出:

    Array的索引超出范围

用户定义的异常

有时,Java中的内置异常无法描述某种情况。在这种情况下,用户还可以创建称为“用户定义的异常”的异常。
按照以下步骤创建用户定义的异常。

  • 用户应创建一个异常类作为Exception类的子类。由于所有异常都是Exception类的子类,因此用户还应使其类成为其子类。这样做是:
    class MyException extends Exception
  • 我们可以在他自己的异常类中编写一个默认构造函数。
    MyException(){}
  • 我们还可以创建一个以字符串为参数的参数化构造函数。
    我们可以使用它来存储异常详细信息。我们可以从中调用super class(Exception)构造函数并将字符串发送到那里。
    MyException(String str)
    {
       super(str);
    }
  • 要引发用户定义类型的异常,我们需要为其异常类创建一个对象,并使用throw子句将其抛出,如下所示:
    MyException me = new MyException(“Exception详情");
    throw me;
  • 下面的程序说明了如何创建自己的异常类MyException。
  • 帐户,客户名和余额的详细信息以三个数组的形式显示。
  • 在main()方法中,使用for循环显示详细信息。此时,将检查任何帐户中的余额是否少于要存入该帐户的最小余额。
  • 如果是这样,则引发MyException并显示一条消息“余额不足”。
    // Java展示用户定义的异常
    class MyException extends Exception
    {
        // 存储账户信息
        private static int accno[] = {1001, 1002, 1003, 1004};
        private static String name[] =
                     {"Nish", "Shubh", "Sush", "Abhi", "Akash"};
        private static double bal[] =
             {10000.00, 12000.00, 5600.0, 999.00, 1100.55};
        // 默认构造函数
        MyException() {    }
        // 参数化构构造函数
        MyException(String str) { super(str); }
        // 编写main()
        public static void main(String[] args)
        {
            try  {
                // 打印头信息
                System.out.println("ACCNO" + "\t" + "CUSTOMER" +
                                               "\t" + "BALANCE");
                // 展示实际情况
                for (int i = 0; i < 5 ; i++)
                {
                    System.out.println(accno[i] + "\t" + name[i] +
                                                   "\t" + bal[i]);
                    // 展示异常,如果余额 < 1000
                    if (bal[i] < 1000)
                    {
                        MyException me =
                           new MyException("余额小于  1000");
                        throw me;
                    }
                }
            } //try结束
            catch (MyException e) {
                e.printStackTrace();
            }
        }
    }

    运行时错误

     MyException: Balance is less than 1000
        at MyException.main(fileProperty.Java:36)

    输出:

    ACCNO    CUSTOMER    BALANCE
    1001    Nish    10000.0
    1002    Shubh    12000.0
    1003    Sush    5600.0
    1004    Abhi    999.0