Java中的用户定义和自定义异常
例外是程序执行期间发生的问题(运行时错误)。为了理解目的,让我们以不同的方式来看待它。
通常,在编译程序时,如果编译时未创建.class文件,则该文件是Java中的可执行文件,并且每次执行此.class文件时,它都应成功运行以执行程序中的每一行没有任何问题。但是,在某些特殊情况下,JVM在执行程序时会遇到一些模棱两可的情况,它们不知道该怎么做。
这是一些示例方案-
如果您的数组大小为10,则代码中的一行尝试访问该数组中的第11元素。
如果您试图将数字除以0(结果为无穷大,并且JVM不了解如何求值)。
当异常发生时,程序异常终止,这种情况称为异常。某些异常是在编译时提示的,它们称为已检查异常或编译时异常,并且在运行时发生的异常称为运行时异常或未检查异常。
每个可能的异常都由一个预定义的类表示,所有这些类都可以在java.lang包中找到。以下是一些异常类
NullPointerException,ArrayIndexOutOfBoundsException,ClassCastException,IllegalArgumentException,IllegalStateException等…
示例:ArithmeticException
import java.util.Scanner; public class ExceptionExample { public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter first number: "); int a = sc.nextInt(); System.out.println("Enter second number: "); int b = sc.nextInt(); int c = a/b; System.out.println("The result is: "+c); } }
输出结果
Enter first number: 100 Enter second number: 0 Exception in thread "main" java.lang.ArithmeticException: / by zero at ExceptionExample.main(ExceptionExample.java:10)
示例:ArrayIndexOutOfBoundsException
import java.util.Arrays; import java.util.Scanner; public class AIOBSample { public static void main(String args[]){ int[] myArray = {1254, 1458, 5687,1457, 4554, 5445, 7524}; System.out.println("Elements in the array are: "); System.out.println(Arrays.toString(myArray)); Scanner sc = new Scanner(System.in); System.out.println("Enter the index of the required element: "); int element = sc.nextInt(); System.out.println("Element in the given index is :: "+myArray[element]); } }
输出结果
运行时异常-
Elements in the array are: [897, 56, 78, 90, 12, 123, 75] Enter the index of the required element: 7 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7 at AIOBSample.main(AIOBSample.java:12)
示例:ArrayStoreException
import java.util.Arrays; public class ArrayStoreExceptionExample { public static void main(String args[]) { Number integerArray[] = new Integer[3]; integerArray[0] = 12548; integerArray[1] = 36987; integerArray[2] = 555.50; integerArray[3] = 12548; System.out.println(Arrays.toString(integerArray)); } }
输出结果
运行时异常-
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double at ther.ArrayStoreExceptionExample.main(ArrayStoreExceptionExample.java:9)
示例:NoSuchElementException
import java.util.Enumeration; import java.util.Vector; public class EnumExample { public static void main(String args[]) { //实例化一个Vector- Vector<Integer> vec = new Vector<Integer>( ); //填充向量 vec.add(1254); vec.add(4587); //检索元素 Enumeration<Integer> en = vec.elements(); System.out.println(en.nextElement()); System.out.println(en.nextElement()); //到达终点后检索下一个元素 System.out.println(en.nextElement()); } }
输出结果
运行时异常-
1254 4587 Exception in thread "main" java.util.NoSuchElementException: Vector Enumeration at java.util.Vector$1.nextElement(Unknown Source) at July_set2.EnumExample.main(EnumExample.java:18)
用户定义的异常
您可以使用Java创建自己的异常,这些异常称为用户定义的异常或自定义异常。
要创建用户定义的异常,请扩展上述类之一。要显示消息,请重写toString()方法,或者以String格式绕过消息来调用超类参数化的构造函数。
MyException(String msg){ super(msg); } Or, public String toString(){ return " MyException [Message of your exception]"; }
然后,在需要引发此异常的其他类中,创建创建的自定义异常类的对象,然后使用throw关键字引发该异常。
MyException ex = new MyException (); If(condition……….){ throw ex; }
自定义已检查和自定义未检查
所有异常都必须是Throwable的子级。
如果要编写由Handle或DelareRule自动执行的检查异常,则需要扩展Exception类。
如果要编写运行时异常,则需要扩展RuntimeException类。
示例:自定义检查异常
以下Java程序演示如何创建自定义检查的异常。
import java.util.Scanner; class NotProperNameException extends Exception { NotProperNameException(String msg){ super(msg); } } public class CustomCheckedException{ private String name; private int age; public static boolean containsAlphabet(String name) { for (int i = 0; i < name.length(); i++) { char ch = name.charAt(i); if (!(ch >= 'a' && ch <= 'z')) { return false; } } return true; } public CustomCheckedException(String name, int age){ if(!containsAlphabet(name)&&name!=null) { String msg = "Improper name (Should contain only characters between a to z (all small))"; NotProperNameException exName = new NotProperNameException(msg); throw exName; } this.name = name; this.age = age; } public void display(){ System.out.println("Name of the Student: "+this.name ); System.out.println("Age of the Student: "+this.age ); } public static void main(String args[]) { Scanner sc= new Scanner(System.in); System.out.println("Enter the name of the person: "); String name = sc.next(); System.out.println("Enter the age of the person: "); int age = sc.nextInt(); CustomCheckedException obj = new CustomCheckedException(name, age); obj.display(); } }
输出结果
编译时异常
在编译时,以上程序生成以下异常。
CustomCheckedException.java:24: error: unreported exception NotProperNameException; must be caught or declared to be thrown throw exName; ^ 1 error
示例:自定义未经检查的异常
如果仅将自定义异常继承的类更改为RuntimeException,则它将在运行时引发
class NotProperNameException extends RuntimeException { NotProperNameException(String msg){ super(msg); } }
如果您通过使用上面的代码替换NotProperNameException类并运行它来运行先前的程序,它将生成以下运行时异常。
输出结果
运行时异常
Enter the name of the person: Krishna1234 Enter the age of the person: 20 Exception in thread "main" july_set3.NotProperNameException: Improper name (Should contain only characters between a to z (all small)) at july_set3.CustomCheckedException.<init>(CustomCheckedException.java:25) at july_set3.CustomCheckedException.main(CustomCheckedException.java:41)