初級JAVA 13-異常処理

3420 ワード

エラー
  • コンパイルエラー:コンパイル時に発生したエラー(赤い線)
  • 論理エラー:実行できますが、動作は予想とは異なります(エラー)
  • ランタイムエラー:ランタイムに発生したエラー
  • ランタイムエラー
    プログラムが
  • 実行時にエラーが発生した位置異常終了.
  • エラー:プログラムコードで処理できない重大なエラー(処理不可)
  • 例外:プログラムコードによる軽微なエラー(処理可能)
  • 例外
  • すべての例外はExceptionクラスのサブクラスです.
  • RuntimeExceptionクラスおよびそのサブクラスは、例外処理を強制しない.
  • [RuntimeExceptionクラスおよびそのサブクラスを除く]Exceptionクラスのサブクラスは、強制的に例外処理されます.
  • 異常処理(try-catch)
  • 異常処理により、プログラム異常終了を防止することができる.
  • try {} catch(Exception e) {}
  • try block内のコンテンツを実行中に異常が発生した場合はcatchに移動します.
  • catch()では、処理する例外を指定できます.
  • の複数の例外を処理するために、catchは1つ以上現れる可能性があります.
  • で発生した異常と一致するcatch block内の内容を実行するとtry-catchが終了します.
  • で発生した異常と一致するcatchがなければ、異常は処理されません.
  • try{
    			int result= 10 / 0;
    			System.out.println(result);
    		}catch(ArithmeticException | IndexOutOfBoundsException e){ //에러 내용 복사해서 파라미터에 넣기, |로 이어주면 두개의 예외처리가 가능하다.
    			e.printStackTrace(); //어느 부분에서 에러가 발생했는지 콘솔창에 에러 메시지 나옴
    		}catch(NullPointerException e){
    			
    		}catch(Exception e){ //모든 예외의 부모클래스인 Exception e를 추가(다형성)
    			e.printStackTrace();
    		}
    		
    		try {
    			Thread.sleep(1);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		
    		
    		test1();		
    	}
    
    	private static void test1() {
    		test2();
    	}
    
    	private static void test2() {
    //		System.out.println(10/0); 여러개의 예외가 발생하면 가장 첫줄을 들어간다.
    		try {
    			new FileInputStream(""); //FileInputStream : 파일 경로 읽는 메서드, 파라미터에 경로 넣어줘야 함
    			// 에러 발생시키기 위해 파라미터에 ""넣음
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    }
    finally
    必要に応じてtry-catchの後にfinallyを追加できます.
  • finallyは、例外が発生しているかどうかにかかわらず、最後に実行されます.
  • 自動リソースリターン
  • try(変数宣言;変数宣言){}catch(Exception){}
  • を使用すると、tryの()に戻るオブジェクトが宣言されると、try blockの終了時に自動的に戻ります.
  • 		FileInputStream fis = null; //파일읽기 - 운영체제의 허락을 받아 파일을 연다.
    	
    		try {
    			fis = new FileInputStream("d:/file.txt");
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				fis.close();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		
    		//예외 발생 : try -> catch -> finally
    		//예외 미발생 : try -> finally
    		
    		//자동 자원 반환(JDK1.7)
    		try(FileOutputStream fos = new FileOutputStream("d:/file.txt")){ //d드라이브에 파일 생성
    			String str = "집에 가고 싶어요...";
    			
    			byte[] bytes = str.getBytes();
    			
    			for(int i = 0; i < bytes.length; i++){
    				fos.write(bytes[i]);
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    		
    		
    	}
    ThrowException異常
    try {
    			throw new IOException();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} //강제로 예외 발생시키기
    		
    //		NullPointerException : 변수에 null이 들어있어서 발생된다
    		
    //		String str = null;
    //		System.out.println(str.equals(""));
    
    //	    IndexOutOfBoundsException : 배열의 인덱스를 벗어나서 발생된다.
    		int[] a = new int[10];
    		
    		
    		for(int i = 0; i <= a.length; i++){
    			System.out.println(a[i]);
    		}
    		
    		//파일 이름으로 파일 찾기 : Ctrl + Shift + r
    	}
        
    public class ThrowsException {
    
    	//예외 선언 방법!
    	public static void main(String[] args) {
    		try {
    			method();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	private static void method() throws IOException {
        	//예외선언 : 이 메서드를 호출했을 때 예외가 발생할 가능성이 있다는 걸 알려준다. -> 메서드 뒤에 throws 예외종류 입력
    		throw new IOException(); //선언된 예외는 처리하지 않아도 된다.(예외처리는 메서드를 호출한 곳에서)
    		
    	}
    
    }