java 예외(Exception) 처리 메커니즘 상세 정보
에서 이상을 정의합니다. 현재 방법이나 역할 영역이 계속 실행되는 것을 막는 문제입니다.자바에 이상 처리 메커니즘이 있지만 명확하게 말하자면'정상적인'태도로 이상을 대해서는 안 된다.절대적으로 이상하다는 것은 어떤 의미의 오류이고, 문제이며, 프로그램의 실패를 초래할 수 있다.자바가 이상 처리 메커니즘을 제기하는 이유는 개발자에게 당신의 프로그램에 비정상적인 상황이 발생했음을 알려주는 것입니다. 주의하십시오.
처음에 자바를 배웠을 때 이상은 항상 잘 몰랐던 것을 기억해라. 이 이상이 무슨 뜻인지 모르겠다. 왜 이 메커니즘이 생겼을까?그러나 지식이 쌓이면서 점점 이상에 대한 감각이 생겼다.예를 들어 이상한 용도를 설명하다.
public class Calculator
{
public int devide(int num1,
int num2)
{
// 0
if(num2
== 0)
{
throw new IllegalArgumentException(" ");
}
return num1/num2;
}
}
이 클래스에서 제연산 방법에 대해 보세요. 만약 당신이 초보자라면 계산 결과를 직접 되돌릴 수 있습니다. 어떤 파라미터가 정확한지, 합법적인지 전혀 고려하지 않을 것입니다. (물론 용서할 수 있습니다. 누구나 이렇게 왔습니다.)그러나 우리는 가능한 한 주도면밀하게 고려하여 프로그램 실패를 초래할 수 있는'낌새'를 요람 속에 말살해야 하기 때문에 파라미터의 합법성 검사를 하는 것이 필요하다.그 중에서 매개 변수 검사를 실행하여 던진 그 매개 변수가 불법으로 이상한 것은 이 방법의 비정상적인 상황에 속한다.정상적인 상황에서 우리는 계산기를 정확하게 사용할 것이지만, 부주의로 제수를 0으로 하는 것을 배제하지 않는다.만약 네가 이전에 이런 상황을 고려하지 않았고, 공교롭게도 사용자의 수학 기초가 좋지 않았다면, 너는 끝났을 것이다.그러나 만약 네가 이전에 이런 상황을 고려했다면, 잘못은 이미 네가 장악하고 있는 것이 분명하다.2. 이상 문맹 퇴치 행동
오늘 다른 사람과 이야기할 때 한 우스갯소리를 보았다. 세상에서 가장 진실한 사랑은 너가try를 하고 내가catch를 하고 있다는 것이다.네가 화를 내든지 말든지 나는 묵묵히 감당하고 조용히 처리할 것이다.대부분의 초보자들이 자바에 대한 이상한 느낌은 바로:try...catch....맞아, 이게 제일 많이 쓰고 실용적이야.내 느낌은: 자바 이상은'try...catch...'에서걸어오다
우선 자바의 이상 체계를 익혀보자.
Throwable 클래스는 Java 언어의 모든 오류나 이상한 초클래스입니다.두 개의 하위 클래스가 있습니다. Error 및 Exception입니다.
Error: 합리적인 어플리케이션이 캡처하지 말아야 할 심각한 문제를 나타냅니다.이런 상황은 매우 큰 문제이다. 네가 처리할 수 없을 정도로 크니 내버려 두면 된다. 너는 그것을 상관할 필요가 없다.예를 들어 VirtualMachineError: 자바 가상 머신이 붕괴되거나 필요한 자원을 다 썼을 때 이 오류를 던집니다.그래, 이 이상한 존재가 있어도 언제, 어떻게 처리해야 하지??JVM에게 맡기세요. 그보다 더 전문적인 것은 없습니다.
Exception: 어플리케이션이 캡처하려는 적절한 조건을 나타냅니다.Exception은 두 종류로 나뉜다. 하나는 CheckedException이고, 하나는 UncheckedException이다.이 두 가지 Exception의 차이는 주로 Checked Exception은 try로...catch...캡처가 표시되지만 UncheckedException은 캡처할 필요가 없습니다.일반적으로 Unchecked Exception은 Runtime Exception이라고도 합니다.'effective java'는 복구 가능한 조건에 대해 검사된 이상(CheckedException)을 사용하고, 프로그램 오류(언외의 뜻으로는 복구할 수 없고, 큰 오류가 발생했음)에 대해서는 실행 중인 이상(Runtime Exception)을 사용한다고 지적했다.
우리가 흔히 볼 수 있는 Runtime Excepiton에는 Illegal Argument Exception, Illegal State Exception, Null Pointer Exception, Index Out Of Bounds Exception 등이 있다.CheckedException은 일일이 다 들 수 없습니다. 프로그램을 작성하는 과정에서try...catch...포착된 이상은 모두 CheckedException입니다.io 패키지의 IO Exception과 하위 클래스, 이것들은 모두 Checked Exception입니다.
3. 이상한 사용
이상하게 이 부분을 사용하는 것은 주로 프레젠테이션 코드입니다. 모두 우리가 평소에 코드를 쓰는 과정에서 만날 수 있는 (물론 일부분일 뿐입니다), 벽돌을 던져 옥을 끌어올리는 것입니까!
예1.이 예는 주로 두 가지 방법을 통해 비교를 통해 이상이 발생한 후 코드의 집행 절차를 보여 준다.
public static void testException1()
{
int[]
ints = new int[]
{ 1,
2,
3,
4 };
System.out.println(" ");
try {
System.out.println(ints[4]);
System.out.println(" ");//
,
}
catch (IndexOutOfBoundsException
e) {
System.out.println(" ");
}
System.out.println(" ");
}
/*output:
4
*/
public static void testException2()
{
int[]
ints = new int[]
{ 1,
2,
3,
4 };
System.out.println(" ");
System.out.println(ints[4]);
System.out.println(" ");//
,
}
먼저 예에서 부족한 점을 지적하자면 Index Out of Bounds Exception은 검사되지 않은 이상이기 때문에 try를 사용하지 않아도 된다.catch...포착을 표시하지만, 나의 목적은 같은 이상에 대해 서로 다른 처리 방식을 사용하고, 그것이 어떤 다른 결과가 나올지 보는 것이다.이상이 발생했을 때 첫 번째 방법은try 블록에서 튀어나왔지만, 그 뒤에 있는 코드는 그대로 실행될 것입니다.하지만 두 번째는 다르다. 바로 튀어나오는 방법이 강경하다.첫 번째 방법에서 보자면try...catch...일종의'사무성'보장이다. 그 목적은 프로그램이 이상한 상황에서 실행되는 것을 보장하는 동시에 프로그래머 프로그램에서 오류가 발생한 상세한 정보를 알려주는 것이다. (이 상세한 정보는 때때로 프로그래머 설계에 의존해야 한다.)예2.다시 이상 던지기
public class Rethrow
{
public static void readFile(String
file) throws FileNotFoundException
{
try {
BufferedInputStream
in = new BufferedInputStream(new FileInputStream(file));
}
catch (FileNotFoundException
e) {
e.printStackTrace();
System.err.println(" , , ");
//
throw e;
}
}
public static void printFile(String
file) {
try {
readFile(file);
}
catch (FileNotFoundException
e) {
e.printStackTrace();
}
}
public static void main(String[]
args) {
printFile("D:/file");
}
}
이상한 본뜻은 좋은 것이다. 프로그램을 복구하려고 시도하지만, 현실에서 우리가 복구할 확률은 매우 적다. 우리는 그것으로 잘못된 정보를 기록하는 경우가 많다.만약 당신이 끊임없이 이상을 처리하는 것에 싫증이 난다면, 다시 이상을 던지는 것은 당신에게 좋은 해탈이 될 수 있습니다.고스란히 이 이상을 상급자에게 던지고, 이 방법을 사용하는 사람에게 던지며, 그가 머리를 쓰도록 해라.이렇게 보면 자바 이상(당연히 검사를 받은 이상을 가리키는 말)은 우리에게 많은 폐를 끼친다. 비록 그 출발점은 좋지만.예3.이상 체인의 사용 및 이상 분실
세 가지 이상 클래스 정의: ExceptionA, ExceptionB, ExceptionC
public class ExceptionA
extends Exception
{
public ExceptionA(String
str) {
super();
}
}
public class ExceptionB
extends ExceptionA
{
public ExceptionB(String
str) {
super(str);
}
}
public class ExceptionC
extends ExceptionA
{
public ExceptionC(String
str) {
super(str);
}
}
예외 분실 상황:
public class NeverCaught
{
static void f()
throws ExceptionB{
throw new ExceptionB("exception
b");
}
static void g()
throws ExceptionC
{
try {
f();
}
catch (ExceptionB
e) {
ExceptionC
c = new ExceptionC("exception
a");
throw c;
}
}
public static void main(String[]
args) {
try {
g();
}
catch (ExceptionC
e) {
e.printStackTrace();
}
}
}
/*
exception.ExceptionC
at
exception.NeverCaught.g(NeverCaught.java:12)
at
exception.NeverCaught.main(NeverCaught.java:19)
*/
왜 ExceptionC만 출력되고 ExceptionB는 출력되지 않습니까?이거는 직접 분석해보세요!위의 상황은 일종의 이상이 없어진 셈이다. 이것은 우리가 잘못 배열하는 과정에서 매우 불리하다.그럼 저희가 위의 상황을 만나면 어떻게 해야 하나요?이것이 바로 이상 체인의 용무지이다. 이상 정보를 저장하고 다른 이상을 던지는 동시에 원래의 이상을 잃지 않는다.
public class NeverCaught
{
static void f()
throws ExceptionB{
throw new ExceptionB("exception
b");
}
static void g()
throws ExceptionC
{
try {
f();
}
catch (ExceptionB
e) {
ExceptionC
c = new ExceptionC("exception
a");
//
c.initCause(e);
throw c;
}
}
public static void main(String[]
args) {
try {
g();
}
catch (ExceptionC
e) {
e.printStackTrace();
}
}
}
/*
exception.ExceptionC
at
exception.NeverCaught.g(NeverCaught.java:12)
at
exception.NeverCaught.main(NeverCaught.java:21)
Caused
by: exception.ExceptionB
at
exception.NeverCaught.f(NeverCaught.java:5)
at
exception.NeverCaught.g(NeverCaught.java:10)
...
1 more
*/
이 이상 체인의 특성은 모든 이상을 갖추고 있습니다. 왜냐하면 이 initCause () 방법은 Throwable에서 계승되었기 때문입니다.예4.정리 작업
만약에 자원을 소모하는 작업, 예를 들어 IO, JDBC 등이 있다면, 청소 작업은 우리에게 없어서는 안 될 것이다.만약 우리가 다 쓴 후에 제때에 정확하게 닫지 않는다면, 결과는 매우 심각할 것이다. 이것은 메모리 유출을 의미한다.이상한 출현은 우리가 어떤 상황에서도 자원을 제때에 정확하게 정리할 수 있는 메커니즘을 설계해야 한다고 요구한다.이게 파이널리야.
public void readFile(String
file) {
BufferedReader
reader = null;
try {
reader
= new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
//
do some other work
}
catch (FileNotFoundException
e) {
e.printStackTrace();
}
finally {
try {
reader.close();
}
catch (IOException
e) {
e.printStackTrace();
}
}
}
예는 매우 간단하다. 파일을 읽는 예이다.이런 예는 JDBC 작업에서도 매우 흔히 볼 수 있다.(그래서 나는 자원에 대한 신속한 정리가 프로그래머의 기본 소양 중 하나라고 생각한다.)Try...finally 구조도 자원의 정확한 폐쇄를 보장하는 수단이다.코드 실행 과정에서 어떤 이상이 발생하면 자원을 정리할 수 없는지 잘 모르면try로 이'의심한'코드를 포장하고finally에서 자원을 정리합니다.예를 들어 다음과 같이 하십시오.
public void readFile()
{
BufferedReader
reader = null;
try {
reader
= new BufferedReader(new InputStreamReader(
new FileInputStream("file")));
//
do some other work
//close
reader
reader.close();
}
catch (FileNotFoundException
e) {
e.printStackTrace();
}
catch (IOException
e) {
e.printStackTrace();
}
}
우리는 이 방법과 이전 방법의 차이를 주의해야 한다. 다음 사람은 좀 더 좋은 습관을 가지고 reader를 일찍 닫을 수 있다.그러나 종종 일이 뜻대로 되지 않는다. 왜냐하면reader이기 때문이다.close () 이전의 이상은 언제든지 발생할 수 있으며, 이러한 코드 구조는 어떠한 이상도 예방할 수 없습니다.프로그램이 이상한 곳에서 튀어나오기 때문에 뒤에 있는 코드는 실행할 수 없습니다. (이것은 위에서 실례를 통해 증명해야 합니다.)이럴 때 저희가 트리로...finally로 개조:
public void readFile()
{
BufferedReader
reader = null;
try {
try {
reader
= new BufferedReader(new InputStreamReader(
new FileInputStream("file")));
//
do some other work
//
close reader
}
finally {
reader.close();
}
}
catch (FileNotFoundException
e) {
e.printStackTrace();
}
catch (IOException
e) {
e.printStackTrace();
}
}
자원을 일찍 폐쇄하는 것은 좋은 행동이다. 시간이 길수록 폐쇄를 잊어버릴 가능성이 높기 때문이다.이렇게 맞춰서 try...finally는 만전을 보장합니다.그리고 만약에 제가 구조 방법에서 파일을 열거나 JDBC 연결을 만들고 싶다면 다른 방법에서 이 자원을 사용해야 하기 때문에 구조 방법에서 이 자원을 일찍 닫을 수 없습니다.그럼 우리 어쩔 수 없는 거 아니야?답은 부정적이다.다음 예를 살펴보겠습니다.
public class ResourceInConstructor
{
BufferedReader
reader = null;
public ResourceInConstructor()
{
try {
reader
= new BufferedReader(new InputStreamReader(new FileInputStream("")));
}
catch (FileNotFoundException
e) {
e.printStackTrace();
}
}
public void readFile()
{
try {
while(reader.readLine()!=null)
{
//do
some work
}
}
catch (IOException
e) {
e.printStackTrace();
}
}
public void dispose()
{
try {
reader.close();
}
catch (IOException
e) {
e.printStackTrace();
}
}
}
이 부분은 좀 더 많이 말했지만 이상하게도 사용하기 어려워 보이는 물건이군요. 자바에는 깊이 파야 할 물건이 많습니다.4. 이상한 오용
이상한 오용은 정말 흔한데 윗부분에서 이미 몇 개를 열거했으니 여러분 자세히 보세요.다음은 다른 거 두 개 더 할게요.
예1.하나의 Exception으로 모든 이상을 포착하니, 꽤'일부 당관 만부 몰개'의 기백이 있다.하지만 이것도 가장 어리석은 행동이다.
public void readFile(String
file) {
BufferedReader
reader = null;
Connection
conn = null;
try {
reader
= new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
//
do some other work
conn
= DriverManager.getConnection("");
//...
}
catch (Exception
e) {
e.printStackTrace();
}
finally {
try {
reader.close();
conn.close();
}
catch (Exception
e) {
e.printStackTrace();
}
}
}
이상 각도에서 볼 때 이렇게 엄격한 절차는 틀림없이 모든 이상을 포착할 수 있다.그러나 프로그래머의 입장에서 만약에 이 프로그램이 잘못되면 우리는 도대체 그것이 일으킨 것인지 IO인지 JDBC인지 어떻게 분별해야 합니까?그래서 이런 작법은 반례로 삼을 만하다.모두들 이런 방법이 매우 유치하다고 생각하지 마라, 바보가 할 수 있다.나는 회사에서 실습할 때 비슷한 상황을 확실히 보았다. 단지 사람들이 Exception을 사용하지 않고 Throwable를 사용했을 뿐이다.예2.여기는 예를 들지 않겠습니다. 위의 절차는 모두 반례입니다.이상은 프로그램이 의외의 상황을 처리하는 메커니즘이다. 프로그램이 의외의 상황이 발생할 때 우리는 가능한 한 많은 의외의 정보를 얻어야 한다. 이는 발생하는 위치, 설명, 원인 등을 포함한다.이것들은 모두 우리가 문제를 해결하는 단서이다.그러나 위의 예는 모두 간단한 printStackTrace()일 뿐입니다.만약 우리가 스스로 코드를 쓴다면, 가능한 한 이 이상에 대해 많이 설명해야 한다.예를 들어 왜 이 이상이 생겼는지, 어떤 상황에서 이 이상이 발생했는지.만약 전송 방법의 매개 변수가 정확하지 않다면, 어떤 매개 변수가 합법적인 매개 변수인지 알려주거나,sample를 제시합니다.
예3.tryblock을 간단하게 쓰십시오. 모든 것을 여기에 버리지 마십시오. 우리는 가능한 한 몇 줄의 프로그램에 이상이 발생할 수 있는지 분석합니다. 다만 이상이 발생할 수 있는 코드에 대해try를 합니다.가능한 한 모든 이상을 위해 try를 쓰고...catch, 이상 분실 방지.IO 작업에서 하나의 IO Exception도'일부당관만부몰개'의 기백을 가지고 있다.
총결산
요약은 매우 간단하니 이상을 사용하기 위해 이상을 사용하지 마라.이상은 프로그램 설계의 일부분이므로 그것의 설계에 대해서도 연구해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 예외(Exception) 처리 메커니즘 상세 정보누구나 이렇게 왔습니다.)그러나 우리는 가능한 한 주도면밀하게 고려하여 프로그램 실패를 초래할 수 있는'낌새'를 요람 속에 말살해야 하기 때문에 파라미터의 합법성 검사를 하는 것이 필요하다.그 중에서 매개 변수 검사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.