예외 발생
예외 발생에는 세 가지 형태가 있습니다. 하나는 발생, 다른 하나는 발생이며 시스템이 자동으로 예외를 발생시킵니다. 다음은 이들 사이의 유사점과 차이점입니다.
시스템이 자동으로 예외를 발생시킵니다
프로그램 명령문에 논리적 오류, 교리 오류 또는 유형 변환 오류가 있는 경우 시스템이 자동으로 예외를 발생시킵니다. 예:
public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b); //function(); }
시스템에서 자동으로 ArithmeticException이 발생합니다.
Exception in thread "main" java.lang.ArithmeticException: / by zero at test.ExceptionTest.main(ExceptionTest.java:62)
또 다른 예는
public static void main(String[] args) { String s = "abc"; System.out.println(Double.parseDouble(s)); //function(); }
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224) at java.lang.Double.parseDouble(Double.java:510) at test.ExceptionTest.main(ExceptionTest.java:62)
throw는 예외를 발생시키는 명령문입니다.
구문: throw(예외 개체);
예:
throw e;
public static void main(String[] args) { String s = "abc"; if(s.equals("abc")) { throw new NumberFormatException(); } else { System.out.println(s); } //function(); }
Exception in thread "main" java.lang.NumberFormatException at test.ExceptionTest.main(ExceptionTest.java:67)
throws는 메소드가 예외를 발생시킬 수 있다는 명령문입니다. (메서드를 선언할 때 사용되며, 해당 메서드가 예외를 throw할 수 있음을 나타냅니다.)
구문: [(수정자)](반환 값 유형)(메서드 이름)([매개 변수 목록])[throws(예외 클래스)]{ ......}
예:
public void function() throws Exception{......}
public static void function() throws NumberFormatException{ String s = "abc"; System.out.println(Double.parseDouble(s)); } public static void main(String[] args) { try { function(); } catch (NumberFormatException e) { System.err.println("非数据类型不能转换。"); //e.printStackTrace(); } }
데이터가 아닌 유형은 변환할 수 없습니다.
throw와 throw의 비교
1. Throw는 메소드 함수 헤더에 나타나고, throw는 함수 본문에 나타납니다.
2. throw는 예외의 가능성을 나타내지만 이러한 예외가 반드시 발생하는 것은 아닙니다. throw는 예외가 발생한다는 의미이며, throw를 실행하면 일종의 예외 개체가 발생해야 합니다.
3. 둘 다 예외를 처리하는 수동적인 방법입니다(여기서 부정은 예외를 발생시키거나 발생시킬 수 있다는 의미는 아닙니다). 그러나 예외는 함수에 의해 처리되지 않으며 실제로는 예외가 발생합니다. 이는 함수의 상위 계층 호출에 의해 처리됩니다.
1. 프로그램을 작성할 때 일반적으로 try{...}catch{...}를 사용하여 예외가 발생할 수 있는 부분을 잡아서 실행합니다.
2. try{...}catch{...}로 예외를 catch한 후에는 가장 간단한 출력 문이라도 catch{...}에서 처리해야 합니다. 또는 스택 입력 e.printStackTrace ();
3. IO 입력 및 출력 스트림에서 예외를 포착하는 경우 try{...}catch{...} 뒤에 finally{...}를 추가하여 입력을 입력하세요. 스트림이 닫힙니다.
4. 함수 본문에서 throw를 사용하여 특정 예외가 발생하는 경우 함수 이름에 throws 예외 문을 추가한 다음 이를 호출하는 상위 수준 함수에 전달하는 것이 가장 좋습니다. 처리를 위해.
예:
throw는 이 예외가 이 위치에 던져질 것임을 분명히 합니다.
void doA(int a) throws IOException,{ try{ ...... }catch(Exception1 e){ throw e; }catch(Exception2 e){ System.out.println("出错了!"); } if(a!=b) throw new Exception3("自定义异常"); }
Exception1 예외가 발생하면 이를 포착한 후 발생시키고 메소드 호출자가 처리합니다.
Exception2 예외가 발생하면 메서드가 이를 자체적으로 처리합니다(예: System.out.println("An error 발생!");). 따라서 이 메서드는 더 이상 Exception2 예외를 발생시키지 않으며, void doA()는 Exception1을 발생시키며, Exception3의 Exception2는 작성할 필요가 없습니다.
Exception3 예외는 프로그래머가 직접 처리한 특정 논리 오류입니다. 논리 오류로 인해 예외 3이 발생하면 메서드 호출자도 이 예외를 처리해야 합니다.
throws 문은 메서드 선언 뒤에 사용되어 예외가 발생하고 메서드 호출자가 처리할 것임을 나타냅니다.
throw는 예외를 발생시키는 특정 작업이므로 예외 인스턴스를 발생시킵니다.
무언가를 던지면 그 경향이 현실로 바뀌는 것입니다.