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
块中捕获该异常,并打印出异常消息。
最后,输出学生对象的字符串表示形式。
这样的设计可以在用户输入年龄时进行异常处理,以确保输入的年龄符合要求,并提供有意义的错误提示。
请注意,RuntimeException
是testException
的父类,因此可以在catch
块中捕获testException
异常。
继承合适的异常类:根据异常的性质和使用场景,选择合适的异常类作为基类。通常情况下,如果异常是由程序错误或逻辑错误引起的,可以选择继承自RuntimeException
类;如果异常是由外部因素或不可控因素引起的,可以选择继承自Exception
类。
提供合适的构造方法:根据需要,为自定义异常类提供适当的构造方法。可以提供无参构造方法和带有详细错误信息的构造方法,以便在抛出异常时传递错误信息。
考虑异常信息的规范性:在自定义异常类中,可以通过重写toString()
方法或提供其他方法来定制异常信息的格式和内容,以便更好地描述异常的原因和上下文信息。
考虑异常的可读性和可理解性:为了使异常信息更易读和易理解,可以在自定义异常类中提供有意义的异常消息,并避免使用过于晦涩或技术性的术语。
考虑异常的层次结构:如果有多个相关的自定义异常类,可以考虑使用异常的层次结构来组织和管理异常。通过继承和多态的方式,可以更好地组织和处理不同类型的异常。
考虑异常的处理方式:在使用自定义异常类时,需要根据具体情况选择合适的异常处理方式,例如使用try-catch
块捕获和处理异常,或者将异常向上抛出给调用者处理。
考虑异常的文档说明:在自定义异常类的文档注释中,应该清楚地说明该异常的使用场景、原因和可能的解决方法,以便其他开发人员能够正确地处理和理解该异常。
通过合理地定义和使用自定义异常类,可以提高代码的可读性和可维护性,同时也能更好地处理和传递异常信息,从而提升程序的健壮性和可靠性。