자바의 이상 처리 메커니즘을 전면적으로 이해하다
11360 단어 java이상 처리 메커니즘
이상은 프로그램이 실행될 때 비정상적인 운행이 발생하는 것이다
1. 이상 유래:
자바의 유형 형식을 통해 현실 사물의 문제에 대한 묘사를 하고 대상이 되었다
사실 자바가 비정상적인 상황을 묘사한 대상의 표현이에요.
2. 문제에 대한 구분은 두 가지가 있다. 하나는 심각한 문제이고 하나는 시비가 심각한 문제이다.
심각한 경우, 자바는 Error 클래스를 통해 설명합니다
Error에 대해 일반적으로 맞춤형 코드를 작성하지 않고 처리합니다.
심각하지 않은 경우, 자바는 Exception 클래스를 통해 설명합니다
Exception의 경우 맞춤형 처리 방식을 사용할 수 있습니다.
3. 흔히 볼 수 있는 이상은 수조 각표 경계 이상, 빈 바늘 이상...
4. Error나 Exception과 상관없이 공통된 내용이 있습니다.
예를 들어 비정상적인 상황의 소식, 원인 등이다.
Throwable//상위 클래스 (아래 두 클래스가 동일하게 추출됨)
|--Error
|--Excption//두 개의 하위 클래스 (이상 발생)/* 상위 클래스 이름은 하위 클래스 접미사 이름으로 */
인스턴스 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");
}
}
실행 결과:Exception in thread "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];
}
}
실행 결과:Exception in thread "main"java.lang.OutOfMemoryError: Java heap space
at ExceptionDemo.main(ExceptionDemo.java:19)
java.lang.OutOfMemoryError: 메모리 넘침 이상을 나타냅니다.
2. 예외적인 처리:
이상 처리에 대해java는 특유의 문장을 제공하여 처리한다
형식
try
{
검출이 필요한 코드;
}
catch
{
이상한 코드 처리하기;(처리 방식)
}
finally
{
반드시 실행되는 코드;(처리 방식)
}
실례1: trycatch 문장 보여주기
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];*/
}
}
실행 결과:제수가 틀리다
over
결과 분석: 프로그램이 실행될 때, 제법의 문장:return x/y를 실행할 때, 이상한 대상 new Aritchmeticexception () 을 생성합니다.try문장은 이 대상을catch문장의 매개 변수로 포획합니다
Exception e =new AritchmeticException();
catch의 처리 문장을 실행하면 문제가 처리됩니다. 종료 문장, 출력over
실례2: 포착된 이상 대상에 대한 일반적인 방법 조작(부류 Throwable 방법)
String getMessage();//이상 정보 가져오기
toString()//반환 예외 이름: 예외 정보
printStackTrace()//출력 예외 이름, 예외 정보, 예외 발생 위치
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];*/
}
}
실행 결과:제수가 틀리다
/by zero
java.lang.ArithmeticException:/by zero
java.lang.ArithmeticException:/by zero
at Demo.div(ExceptionDemo.java:5)
at ExceptionDemo.main(ExceptionDemo.java:17)
over
실행 결과 분석에 의하면 사실 jvm의 기본 이상 처리 메커니즘은 printStackTrace 방법을 호출하는 것이다.
실례3: 이상한 두 가지 처리 방식 던지기
1. jvm 가상 머신에 던지기
2. 던진 이상 스스로 처리
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");
}
}
실행 결과:ExceptionDemo.java:15: 오류: 보고되지 않은 이상 오류 Exception;캡처 또는 선언해야 합니다.
내던지다
int x=d.div(4,0);
^
오류 1개
결과 분석: 이상 발생 가능성에 대한 처리가 없기 때문이다
처리 방식 1: 끊임없이 이상을 던져 jvm 가상 머신이 스스로 처리하도록 한다
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");
}
}
처리 방식 2: 자체 처리 예외
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");
}
}
}
요약:함수에 이상을 표시합니다.안전성을 높이고 출처를 조정하여 처리하기 편리하며 번역 실패를 처리하지 않습니다.
인스턴스 4: 다중 예외 처리
1. 이상 성명 시 보다 구체적인 이상을 성명하는 것을 권장합니다. 이렇게 하면 더욱 구체적으로 처리할 수 있습니다
2. 몇 개의 이상을 설명하면 몇 개의catch 블록이 있어야 하며, 여분의 catch를 빨리 정의하지 마세요.
여러 개의catch 블록에 이상이 있으면 계승 관계가 발생합니다. 부류 이상catch 블록은 아래에 있습니다.
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
권장 사항:
catch 처리를 할 때,catch에서 구체적인 처리 방식을 정의해야 합니다
e.printStackTrace () 를 간단히 정의하지 마십시오.
간단하게 출력 문장을 쓰지 마세요.
사용자가 이해하지 못하기 때문에, 파일에 저장하고, 정시에 우리 개발자에게 보내서 보는 것이 가장 좋다.
인스턴스 5: 사용자 정의 예외
당신들은 우리가 사용하고 있는 이상이 모두 자바에 봉인된 것을 발견했습니까?
그러나 실제 개발에서 우리 프로그램에 발생한 이상은 자바가 봉인하지 않은 것일 수도 있습니다.
이럴 때는 스스로 정의해야 한다
나는 위의 코드에 근거하여 제수를 음수로 할 수 없다고 정의하는데, 코드는 다음과 같다.
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가 이상 대상을 던지면 대응하는 처리 동작을 해야 합니다.
내부trycatch에서 처리하든가.
함수에 호출자가 처리하도록 성명하거나.
일반적인 상황은 함수 내에 이상이 발생하면 함수에 성명이 필요하다.
인쇄된 결과에 이상한 이름만 있고 이상한 정보는 없습니다.
사용자 정의 이상이 정보를 정의하지 않았기 때문입니다.
어떻게 이상 정보를 정의합니까?
부류에서 이상 정보의 조작을 모두 완성했기 때문이다.
그래서 하위 클래스는 구성할 때 이상 정보를 상위 클래스에 슈퍼 문장을 통해 전달한다.
그러면 getMessage 방법을 통해 사용자 정의 이상 정보를 직접 얻을 수 있습니다.
사용자 정의 이상은 사용자 정의 클래스 계승 Exception이어야 합니다.
상속 예외 원인:
이상 체계는 이상류와 이상 대상이 모두 던져지기 때문에 특징이 있다.
그들은 모두 투포성을 갖추고 있다.이 가포성은 Throwable라는 체계에서 독특한 특징이다.
이 시스템의 클래스와 대상만throws와throw에 의해 조작될 수 있습니다.
throws와throw의 차이
throws는 함수에 사용됩니다.
throw는 함수에 사용됩니다.
throws 뒤에 따라오는 이상류.여러 개 따라갈 수 있어요.쉼표로 구분하다.
throw 뒤꿈치는 이상 대상입니다.
실례 6: Exception에 특수한 하위 클래스 이상이 있습니다. Runtime Exception이 실행될 때 이상합니다.
함수 내용에서 이 이상을 던지면 함수에서 설명하지 않고 컴파일할 수 있습니다.
만약 함수에 이 이상이 성명되었다면, 호출자는 처리하지 않고 컴파일할 수 있습니다
함수에 설명하지 않는 이유는 호출자가 처리할 필요가 없기 때문이다
이 이상이 발생하면 프로그램이 멈추기를 바랍니다. 실행할 때 실행할 수 없는 상황이 발생했기 때문입니다. 프로그램이 멈추면
프로그래머는 이 코드를 수정했다.
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)
위의 결과에서 알 수 있듯이
사용자 정의 이상 시: 이 이상이 발생하면 연산을 계속할 수 없습니다.
사용자 정의 예외가 Runtime Exception을 상속하도록 합니다.
예외의 경우
1, 컴파일할 때 검출된 이상.
2, 컴파일할 때 감지되지 않는 이상 (런타임 이상. Runtime Exception 및 하위 클래스)
이상의 이 글은 자바의 이상 처리 메커니즘이 바로 편집자가 여러분에게 공유한 모든 내용을 전면적으로 이해했습니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.