1. 자바 예외 개요:
예외는 프로그램 실행 시 비정상적인 동작 조건입니다.
1. 예외의 발생 원인:
형태에 따른 현실 반영 Java 클래스의 문제에 대한 설명과 객체
는 실제로 Java
에서 설명하는 비정상적인 상황의 객체 표현입니다. 2. 문제를 분류하는 방법에는 두 가지가 있습니다. 하나는 심각합니다. 문제는 심각하지 않은 문제입니다
심각한 문제의 경우 Java는 Error 클래스를 사용하여 이를 설명합니다.
오류의 경우 일반적으로 이를 처리하기 위한 대상 코드가 작성되지 않습니다
심각하지 않은 경우, Java는 Exception 클래스를 사용하여 설명합니다.
예외는 지정된 방식으로 처리될 수 있습니다.
3. 일반적인 예외에는 배열 인덱스 범위를 벗어난 예외, 널 포인터 예외가 포함됩니다. ...
4. Error와 Exception에는 공통된 내용이 있습니다.
예: 비정상적인 상황, 원인 등에 대한 뉴스
Throwable //상위 클래스(다음 두 클래스의 동일한 공통성에서 추출)
|--Error
|--Excption //두 개의 하위 클래스(Many 내부) 문제가 정의됨(예외 발생)) /*상위 클래스 이름은 하위 클래스의 접미사 이름으로 사용됩니다*/
인스턴스 1: 예외 예
class Demo { public int div(int x,int y) { return x/y; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); int x=d.div(4,0); //0作为除数 System.out.println("x="+x); System.out.println("over"); } }
실행 결과:
스레드 "main"의 예외 java.lang.ArithmeticException: / by zero
at Demo.div(ExceptionDemo.java:5)
at ExceptionDemo.main( ExceptionDemo.java :15)
위의 결과를 보면 5행과 15행에서 예외가 발생한 것을 알 수 있습니다. 이는 나누기 메커니즘 때문에 제수는 0이 될 수 없습니다. , 실행 시 예외가 발생합니다.
예 2: 예외 발생 예 2, 메모리 오버플로
class Demo { public int div(int x,int y) { return x/y; } } class ExceptionDemo { public static void main(String args[]) { /*Demo d=new Demo(); int x=d.div(4,0); System.out.println("x="+x); System.out.println("over"); */ byte[] arr=new byte[1024*1024*1000]; } }
실행 결과:
스레드 "main" java.lang에서 예외가 발생했습니다. OutOfMemoryError: Java 힙 공간
at ExceptionDemo.main(ExceptionDemo.java:19)
java.lang.OutOfMemoryError: 메모리 오버플로 예외를 나타냅니다
2. 예외 처리:
예외 처리를 위해 Java는
Format
try
{
감지해야 하는 코드
< 처리를 위한 고유한 명령문을 제공합니다. 🎜>}catch{ 예외 처리 코드(처리 방법) }드디어{ 반드시 실행될 코드(처리 방법) }예시 1: try catch 문 시연class Demo { public int div(int x,int y) { return x/y; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); try { int x=d.div(4,0); System.out.println("x="+x); } catch(Exception e) { System.out.println("除数有误"); } System.out.println("over"); /*byte[] arr=new byte[1024*1024*1000];*/ } }
class Demo { public int div(int x,int y) { return x/y; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); try { int x=d.div(4,0); System.out.println("x="+x); } catch(Exception e) { System.out.println("除数有误"); //获得异常信息 System.out.println(e.getMessage()); //获得异常信息,异常名称 System.out.println(e.toString()); //输出异常名称,异常信息,异常出现的位置 e.printStackTrace(); } System.out.println("over"); /*byte[] arr=new byte[1024*1024*1000];*/ } }
java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
class Demo { public int div(int x,int y)throws Exception /*有可能出现异常的地方抛出异常*/ { return x/y; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); int x=d.div(4,0); System.out.println("x="+x); System.out.println("over"); } }
throw
int x=d .div(4,0)를 포착하거나 선언해야 합니다. );
^
class Demo { public int div(int x,int y)throws Exception /*有可能出现异常的地方抛出异常*/ { return x/y; } } class ExceptionDemo { public static void main(String args[]) throws Exception /*继续抛出异常,给虚拟机*/ { Demo d=new Demo(); int x=d.div(4,0); System.out.println("x="+x); System.out.println("over"); } }
class Demo { public int div(int x,int y)throws Exception /*有可能出现异常的地方抛出异常*/ { return x/y; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); try //自己处理异常 { int x=d.div(4,0); System.out.println("x="+x); } catch(Exception e) { System.out.println("除数有误"); //获得异常信息,异常名称 System.out.println(e.toString()); System.out.println("over"); } } }
class Demo { public int div(int x,int y)throws ArithmeticException,ArrayIndexOutOfBoundsException { int arr[]=new int [x]; System.out.println(arr[4]); return x/y; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); try { int x=d.div(4,0); System.out.println("x="+x); } catch(ArithmeticException e) /*除法法则异常对象接收,第一个执行*/ { System.out.println("除数有误"); //获得异常信息,异常名称 System.out.println(e.toString()); System.out.println("over"); } catch(ArrayIndexOutOfBoundsException e) /*数据越界的对象接收,第二个执行*/ { System.out.println("数组越界了"); //输出异常信息 System.out.println(e.toString()); } catch(Exception e) /*父类Exception接收,最后执行,建议不要写这个,让程序终止*/ /*用到了多态*/ { System.out.println(e.toString()); } } }
java.lang.ArrayIndexOutOfBoundsException: 4
class Demo { public int div(int x,int y)throws FuShuException /*抛出异常*/ { if(y<0) { throw new FuShuException("分母出现负数了------/bu FuShu",y); /*自己手动抛出异常的对象*/ } return x/y; } } class FuShuException extends Exception { private int value; FuShuException(String m,int value) { super(m); /*给父类Exception的getMessage方法传递参数*/ this.value=value; } public int getValue() /*自定义的方法,返回负数*/ { return value; } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); try { int x=d.div(4,-3); System.out.println("x="+x); } catch(FuShuException e) /*捕获异常对象*/ { System.out.println(e.getMessage()+e.getValue()); } System.out.println("over"); } }
over
从上面的结果,可以看出
在本程序中,对于除数是-3,也视为是错误的是无法进行运算的。
那么就需要对这个问题进行自定义的描述。
当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理。
要么在函数上声明让调用者处理。
一般情况在,函数内出现异常,函数上需要声明。
发现打印的结果中只有异常的名称,却没有异常的信息。
因为自定义的异常并未定义信息。
如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。
自定义异常必须是自定义类继承Exception。
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throws和throw操作。
throws和throw的区别
throws使用在函数上。
throw使用在函数内。
throws后面跟的异常类。可以跟多个。用逗号隔开。
throw后跟的是异常对象。
实例6:Exception中有一个特殊的子类异常RuntimeException 运行时异常
如果在函数内容抛出该异常,函数上可以不声明,编译一样通过。
如果函数上声明了该异常,调用者可以不进行处理,编译一样通过
之所以不用在函数声明,是因为不需要让调用者处理
当该异常发生,希望程序停止,因为在运行时,出现了无法运行的情况,希望程序停止后
程序员对该代码进行修改。
class Demo { public int div(int x,int y)throws FuShuException /*抛不抛结果都一样*/ { if(y<0) { throw new FuShuException("分母出现负数了------/bu FuShu",y); } return x/y; } } class FuShuException extends RuntimeException /*继承RuntimeException*/ { FuShuException(String m,int value) { super(m); } } class ExceptionDemo { public static void main(String args[]) { Demo d=new Demo(); int x=d.div(4,-3); /*运行到这会出现异常,编译没有问题*/ System.out.println("x="+x); System.out.println("over"); } }
运行结果:
Exception in thread "main" FuShuException: 分母出现负数了------/bu FuShu
at Demo.div(ExceptionDemo.java:7)
at ExceptionDemo.main(ExceptionDemo.java:26)
从上面的结果可以看出:
自定义异常时:如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeException。
对于异常分两种:
1,编译时被检测的异常。
2,编译时不被检测的异常(运行时异常。RuntimeException以及其子类)
以上这篇全面理解java中的异常处理机制就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHP中文网。
更多全面理解java中的异常处理机制相关文章请关注PHP中文网!