2015 학년도 2 학기
예외? 프로그램실행중에발생하는예기치않은사건 예외가발생하는경우 정수를 0으로나누는경우 배열의크기보다큰인덱스로배열의원소를접근하는경우 파일의마지막부분에서데이터를읽으려고하는경우 예외처리 프로그램에문제를발생시키지않고프로그램을실행할수있게적절한조치를취하는것 자바는예외처리기를이용하여예외처리를할수있는기법제공 자바는예외를객체로취급!!
나뉨수를입력하시오 :100 나눗수를입력하시오 :0 Exception in thread "main" java.lang.arithmeticexception: / by zero at ExceptionExample1.main(ExceptionExample1.java:12) divisor 을 0 으로입력해보자!! 결과는?? ArithmeticException 예외
자바는예외를객체로취급 예외관련클래스 java.lang 패키지에서제공 예외관련클래스계층구조 자바프로그램에서는 Error, RuntimeException 클래스의하위클래스들을제외한모든예외를처리하여야함 일반적으로 Error, RuntimeException 클래스들과연관된예외는프로그램에서처리하지않음 예외를처리하여얻는이득보다예외를처리하기위한노력이너무크기때문
try - catch (- finally) 문 발생한예외에대해개발자가작성한프로그램내에서대응하는것 try{ 예외가발생할가능성이있는실행문 (try 블록 ) catch( 처리할예외타입선언 ){ 예외처리문 (catch 블록 ) finally{ //finally 생략가능예외발생여부와상관없이무조건실행되는문장
try 블록에서예외가발생하지않은정상적인경우 try {... 실행문... catch ( 처리할예외타입선언 ) { 예외처리문 finally { finally 블록문 try 블록에서예외가발생한경우 try {... 에외발생실행문... catch ( 처리할예외타입선언 ) { 예외처리문 finally { finally 블록문
예외 예외가발생할때 ArithmeticException 정수를 0 으로나눌때발생 NullPointerException Null 레퍼런스참조할때발생 ClassCastException 변환할수없는타입으로객체를변환할때발생 OutOfMemoryException 메모리가부족한경우발생 ArrayIndexOutOfBoundsException 배열의범위를벗어난접근시발생 IllegalArgumentException 잘못된인자전달시발생 IOException 입출력동작실패또는인터럽트시발생 NumberFormatException 문자열이나타내는숫자와일치하지않는타입의숫자로변환시발생 ClassNotFoundException 클래스가존재하지않을때발생 IlligalAcessException 클래스에대한접근이금지된경우
import java.util.scanner; public class ExceptionExample2 { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.print(" 나뉨수를입력하시오 :"); dividend = rd.nextint(); System.out.print(" 나눗수를입력하시오 :"); divisor = rd.nextint(); try { ArithmeticException 예외발생 System.out.println(dividend+" 를 "+divisor+" 로나누면몫은 "+ dividend/divisor+" 입니다."); catch (ArithmeticException e) { System.out.println("0 으로나눌수없습니다."); 나뉨수를입력하시오 :100 나눗수를입력하시오 :0 0 으로나눌수없습니다.
위의코드에서발생하는 import java.io.*; public class ExceptionExample { public static void main(string[] args){ FileReader file = new FileReader("a.txt"); int i; 예외를처리할예외처리 문장을작성하시오. while((i=file.read())!= -1){ System.out.println((char)i); file.close();
import java.io.*; public class ExceptionExample { public static void main(string[] args){ FileReader file; try { file = new FileReader("a.txt"); int i; while((i=file.read())!= -1){ System.out.println((char)i); file.close(); catch (Exception e) { System.out.println(e); //e.printstacktrace();
이모두를처리하는클래스를작성하여라. 처리는 main() 내에서이루어져도무방. 단. a 와 b 값은명령행인자로값을받아서사용!! 처리해야하는예외 ) 1) 예외발생하지않은경우 2) 0 나누기를수행하여예외처리한경우 3) 배열의인덱스의범위를벗어난요소참조하는경우
import java.util.scanner; public class ExceptionExample { public static void main(string[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.println(" 매개변수로받은두개의값 "); System.out.print("a = "); dividend = rd.nextint(); System.out.print("b = "); divisor = rd.nextint(); try { System.out.println("a 를 b 로나누면몫 : + dividend / divisor); System.out.println(" 나눗셈이수행되었습니다."); catch (ArithmeticException e) { System.out.println(e + " - 예외발생 "); finally{ System.out.println("***************************************"); System.out.println(); System.out.println(" 예외처리를끝내고 finally 문장을수행합니다.");
public class ExceptionExample { public static void main(string[] args){ System.out.println(" 매개변수로받은두개의값 "); try{ System.out.println(args[0]); catch(exception e){ System.out.println(e + " - 예외발생 "); finally{ System.out.println("**************************"); System.out.println(); System.out.println(" 예외처리를끝내고 finally 문장을수행 ");
예외처리를직접하지않고, 자신을호출한메소드에게예외를넘겨주 는방법 처리해야하는모든예외를하나의메소드에서처리하게할때유용 void 메소드이름 () throws 예외클래스 [, 예외클래스 ] { // 메소드내용 예 ) void a() throws ArithmeticException, NumberFormatException{ // 메소드내용
public static void a() throws Exception{ System.out.println("b() 메소드호출전 "); b(); System.out.println("b() 메소드호출후 "); System.out.println(" 메소드 a() 의 finally 블록수행."); public static void b() throws Exception{ System.out.println("c() 메소드호출전 "); c(); System.out.println("c() 메소드호출후 "); System.out.println(" 메소드 b() 의 finally 블록수행."); public static void c() throws Exception{ System.out.println(" a 를 b 로나눈몫 = " + (a/b)); System.out.println(" 메소드 c() 의 finally 블록수행.");
프로그램에서인위적으로예외발생가능 예외발생시키기위해 throw 문사용 throw 예외객체 ; 또는 throw new 예외객체타입 ( 매개변수 );
사용자는새로운예외를정의하여사용가능 새로운예외는 Exception 클래스로부터상속되어생성해야함 class UserException1 extends Exception { // 사용자정의예외는 Exception 클래스로부터상속 public UserException1(String message){ // 생성자메소드 super(message); // 상위클래스인 Exception 클래스의생성자를호출하여예외객체생성
출력결과는?
try-catch 문을이용하여정수를 0 으로나누려고할때 "0 으로나룰수없습니다." 라는경고메시지를출력하도록프로그램을작성하시오. import java.util.scanner; public class ExceptionExample2 { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.print(" 나뉨수를입력하시오 :"); dividend = rd.nextint(); System.out.print(" 나눗수를입력하시오 :"); divisor = rd.nextint(); try { System.out.println(dividend+" 를 "+divisor+" 로나누면몫은 "+ dividend/divisor+" 입니다."); catch (ArithmeticException e) { System.out.println("0으로나눌수없습니다."); ArithmeticException 예외발생 나뉨수를입력하시오 :100 나눗수를입력하시오 :0 0 으로나눌수없습니다.
public class ArrayException { public static void main (String[] args) { int[] intarray = new int[5]; intarray[0] = 0; try { for (int i = 0; i < 5; i++) { intarray[i+1] = i+1 + intarray[i]; System.out.println("intArray["+i+"]"+"="+intArray[i]); 배열의인덱스가범위를벗어날때발생하는 ArrayIndexOutOfBoundsException 을처리하는프로그램을작성하시오. i 가 4 일때 ArrayIndexOutOfBoundsException 예외발생 intarray[0]=0 intarray[1]=1 intarray[2]=3 intarray[3]=6 배열의인덱스가범위를벗어났습니다. catch (ArrayIndexOutOfBoundsException e) { System.out.println(" 배열의인덱스가범위를벗어났습니다.");
public class NumException { public static void main (String[] args) { String[] stringnumber = {"23", "12", "998", "3.141592"; try { for (int i = 0; i < stringnumber.length; i++) { int j = Integer.parseInt(stringNumber[i]); System.out.println(" 숫자로변환된값은 " + j); catch (NumberFormatException e) { System.out.println(" 정수로변환할수없습니다."); 문자열을정수로변환할때발생하는 NumberFormatException 을처리하는프로그램을작성하라. 3.141592 를정수로변환할때 NumberFormatException 예외발생 숫자로변환된값은 23 숫자로변환된값은 12 숫자로변환된값은 998 정수로변환할수없습니다.