自定义异常类

自定义异常

  • 自定义异常步骤
    • 1.定义异常类
    • 使用自定义异常类
  • 自定义异常类的注意点

自定义异常步骤

  1. 定义异常类
  2. 写继承关系
  3. 提供空参构造
  4. 提供带参构造

1.定义异常类

package ErrorAndApi.Ecxrption;

public class testException extends RuntimeException{
    public  testException(){super();}
    public  testException(String s){super(s);}
}

上面代码定义了一个名为testException的自定义异常类,它继承自RuntimeException类。该异常类有两个构造方法,一个是无参构造方法,另一个是带有一个字符串参数的构造方法。
上面的代码,testException类可以用于在程序中抛出自定义的运行时异常。通过继承RuntimeException类,可以自定义异常类将具有运行时异常的特性,即不需要在方法签名中声明或捕获该异常。

使用自定义异常类

  public class Main {
  public static void main(String[] args) {
      try {
          throw new testException("自定义异常测试");
      } catch (testException e) {
          System.out.println("捕获到自定义异常:" + e.getMessage());
      }
  }
}

在上述示例中,我们在try块中使用throw关键字抛出了一个testException异常,并传递了一个字符串参数作为异常消息。然后,在catch块中捕获该异常,并打印出异常消息。
由于testException是继承自RuntimeException的运行时异常,因此在方法签名中不需要声明或捕获该异常。这使得可以更灵活地在程序中抛出和处理自定义异常。

我们也可以在对象类类里面抛出自定义的异常类
比如

package ErrorAndApi.Ecxrption;

public class Student1 {
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {

        if(age<25){
           throw  new testException("年龄需要大于25");
        }else {
            this.age = age;
        }


    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在上面的代码中,Student1类具有age和name两个私有属性,并提供了相应的getter和setter方法。

在setAge方法中,您使用了自定义的异常类testException。如果传入的年龄小于25,将抛出testException异常,并传递错误信息"年龄需要大于25"。否则,将设置age属性为传入的年龄值。

这样的设计可以在设置年龄时进行条件检查,并在不满足条件时抛出异常,以提醒调用者年龄需要大于25。

  • 调用示例
package ErrorAndApi.Ecxrption;

import java.util.Scanner;

public class Demo3 {
    public static void main(String[] args) {
        Student student = new Student();
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入姓名");
        student.setName(sc.nextLine());

        while (true) {

            System.out.println("请输入学生年龄");
            String ageStr = sc.nextLine();
            int age = 0;

            try {
                age = Integer.parseInt(ageStr);
                student.setAge(age);
                break;
            } catch (NumberFormatException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
                String string = e.toString();
                System.out.println(string);
            } catch (RuntimeException e) {
                System.out.println(e.getMessage());
            }

        }

        System.out.println(student.toString());
    }
}

在上面的代码中,Demo3类使用了Student类,并通过用户输入设置了学生的姓名和年龄。

在设置年龄的过程中,使用了try-catch语句块来处理可能发生的异常。首先,通过Scanner获取用户输入的年龄字符串ageStr。然后,尝试将ageStr转换为整数类型,并调用student.setAge(age)方法设置学生的年龄。

如果转换过程中发生了NumberFormatException异常,说明用户输入的年龄字符串无法转换为整数。在catch块中,打印出异常消息并输出异常堆栈信息。

如果在调用student.setAge(age)方法时抛出了RuntimeException异常(即testException异常),在第二个catch块中捕获该异常,并打印出异常消息。

最后,输出学生对象的字符串表示形式。

这样的设计可以在用户输入年龄时进行异常处理,以确保输入的年龄符合要求,并提供有意义的错误提示。

请注意,RuntimeExceptiontestException的父类,因此可以在catch块中捕获testException异常。

  • 运行结果
    自定义异常类_第1张图片

自定义异常类的注意点

  • 在定义自定义异常类时,有几个注意点需要考虑:
  1. 继承合适的异常类:根据异常的性质和使用场景,选择合适的异常类作为基类。通常情况下,如果异常是由程序错误或逻辑错误引起的,可以选择继承自RuntimeException类;如果异常是由外部因素或不可控因素引起的,可以选择继承自Exception类。

  2. 提供合适的构造方法:根据需要,为自定义异常类提供适当的构造方法。可以提供无参构造方法和带有详细错误信息的构造方法,以便在抛出异常时传递错误信息。

  3. 考虑异常信息的规范性:在自定义异常类中,可以通过重写toString()方法或提供其他方法来定制异常信息的格式和内容,以便更好地描述异常的原因和上下文信息。

  4. 考虑异常的可读性和可理解性:为了使异常信息更易读和易理解,可以在自定义异常类中提供有意义的异常消息,并避免使用过于晦涩或技术性的术语。

  5. 考虑异常的层次结构:如果有多个相关的自定义异常类,可以考虑使用异常的层次结构来组织和管理异常。通过继承和多态的方式,可以更好地组织和处理不同类型的异常。

  6. 考虑异常的处理方式:在使用自定义异常类时,需要根据具体情况选择合适的异常处理方式,例如使用try-catch块捕获和处理异常,或者将异常向上抛出给调用者处理。

  7. 考虑异常的文档说明:在自定义异常类的文档注释中,应该清楚地说明该异常的使用场景、原因和可能的解决方法,以便其他开发人员能够正确地处理和理解该异常。

通过合理地定义和使用自定义异常类,可以提高代码的可读性和可维护性,同时也能更好地处理和传递异常信息,从而提升程序的健壮性和可靠性。

你可能感兴趣的:(java,开发语言)