오류의 종류
에러 - 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
프로그램 실행중 어떤원인에 의해 오작동하거나 비정상 종료된 경우.
이를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.
발생시점에 따라 컴파일에러 Compile Error, 와 런타임 에러 Runtime Error 로 나눌수 있다.
외에도 논리적 에러 Logical Error가 있다.
예외 - 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
* 예외는 코드로 예외처리가 가능하다. 예외처리를 한다면 정상실행상태로 유지할 수 있게 가능하다.
예외의 종류
일반예외 (컴파일체크예외)
개발자가 어떤 소스를 작성하게되면 컴파일러는 그 소스코드에
발생하는 문제점을 예측을하고 예외처리코드를 반드시 넣도록 요구를한다.
실행예외 (런타임예외)
컴파일러가 체크하지 않음
예외클래스 종류
전체 Java.lang.Exception을 상속받는다.
- 일반(컴파일러체크)예외들
주로 사용자의 실수와 같은 외적요인에 의해 발생하는 예외
- 쓰레드를 중지시킬때 사용을하는 예외 java.lang.InterruptedException
- 파일명오타 FileNotFoundException
- 클래스명오타 ClassnotFoundException
- 잘못된 데이터 형식 DataFormatException ...
java.lang.RuntimeException - 일반예외와 실행예외를 구분짓는 예외
- 실행예외들 (java.lang.RuntimeException 상속을 받는다)
프로그래머의 실수로 발생하는 예외
- java.lang.FormatException
- 배열범위 초과 IndexOutOfBoundsException
- null 처리 안함 NullPointerException
- 클래스간 형변환 ClassCastException ...
실행예외(RuntimeException)
NullPointerException - 객체가 없는 null상태에서 접근연산자인 도트(.)를 사용했을 때 발생
ArrayIndexOutOfBoundsException - 배열에서 인덱스 범위 초과하여 사용할 경우 발생
ArrayIndexOutOfBoundsException 예외가 발생하지않게 하는 방법 예제 ↓
package ex1;
public class arrayindexExam {
public static void main(String[] args) {
if(args.length == 2) {
String data1 = args[0];
String data2 = args[1];
System.out.println("args[0]" + data1);
System.out.println("args[1]" + data2);
} else {
//아래는 오류가 생기기지 않고 사용자가 올바르게 값을 입력하게 유도하는 코드
System.out.println("[실행방법]");
System.out.println("java arrayindexExam ");
System.out.println("값1 값2");
}
}
}
NumberFormatException
- 문자열→숫자 변환하는 경우에 숫자로 변환될 수 없는 문자가 포함된 경우 발생
ClassCastException - 타입변환이 되지않을 경우 발생
ClassCastException 예외가 발생하지않게 하는 방법 예제 ↓
package ex1;
public class ClassCastExceptionExam {
public static void main(String[] args) {
Animal animal = new Dog();
Dog dog = (Dog)animal;
//animal이라는 변수가 참조하고있는것은 Dog인데
//Cat으로 casting하면 Runtime때 예외발생
Cat cat = (Cat)animal;
}
}
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
package ex1;
public class ClassCastExceptionExam {
public static void main(String[] args) {
Dog dog = new Dog();
changeDog(dog);
Cat cat = new Cat();
changeDog(cat);
}
public static void changeDog(Animal animal){
//예외가 발생하지 않게 하는 코드
if(animal instanceof Dog) {
Dog dog = (Dog) animal;
} else {
System.out.println("Dog로 변환이 어렵습니다");
}
}
}
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
예외처리 코드란
예외가 발생하면 프로그램 종료를 막고, 정상실행을 유지할 수 있도록 처리하는 코드
-일반 예외 : 반드시 작성해야 컴파일이 된다.
-실행 예외 : 컴파일시 요구하지 않고 경험에 의해서 작성해야 한다.
try-catch-finally
public class TryCatchFinallyExample {
public static void main(String[] args) {
try {
//forName이라는 메소드는 뒤에있는 문자열을 class화 해서 리턴시켜주는 메소드이다.
//존재하지않는 클래스
Class clazz = Class.forName("java.lang.String2");
System.out.println("클래스를 찾았습니다");
} catch (ClassNotFoundException e){
System.out.println("클래스가 존재하지 않습니다");
} finally {
System.out.println("프로그램을 안전하게 종료합니다");
}
}
}
"클래스를 찾았습니다"
"프로그램을 안전하게 종료합니다"
public class TryCatchFinallyExample {
public static void main(String[] args) {
try {
//forName이라는 메소드는 뒤에있는 문자열을 class화 해서 리턴시켜주는 메소드이다.
//존재하는 클래스
Class clazz = Class.forName("java.lang.String");
System.out.println("클래스를 찾았습니다");
} catch (ClassNotFoundException e){
System.out.println("클래스가 존재하지 않습니다");
} finally {
System.out.println("프로그램을 안전하게 종료합니다");
}
}
}
"클래스가 존재하지 않습니다"
"프로그램을 안전하게 종료합니다"
예제1
package ex1;
public class TryCatchFinallyExceptionExam {
public static void main(String[] args) {
String data1 = null;
String data2 = null;
try {
data1 = args[0];
data2 = args[1];
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("실행 매개값의 수가 부족합니다.");
System.out.println("[실행 방법]");
System.out.println("java TryCatchFinallyExceptionExam num1 num2");
return;
}
try{
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data1);
int result = value1 + value2;
System.out.println(data1+ "+" +data2 + "=" +result);
} catch (NumberFormatException e){
System.out.println("숫자로 변환할 수 없습니다.");
} finally {
System.out.println("다시 실행해 주세요.");
}
}
}
예제2
import java.util.ArrayList;
public class main {
public static void main(String[] args) {
boolean checkTrue = false;
String[] gameProcess = {"성공","성공","실패","성공","뭐지?"};
ArrayList<String> savePoint = new ArrayList<>();
int SuccessCountSave = 0;
try{
for(String success : gameProcess){
if(success.equals("성공")){
System.out.println("1--성공하였습니다");
savePoint.add(success);
SuccessCountSave++;
} else if (success.equals("실패")) {
throw new Exception("2--실패하였습니다");
}else{
System.out.println("오류입니다");
throw new Exception("3--알수없는오류입니다");
}
}
}catch (Exception e){
System.out.println(e);
checkTrue = false;
System.out.println("checkTrue : "+checkTrue);
}finally {
System.out.println("다음 처리된 프로세스를 출력합니다");
for(String saveContent : savePoint){
System.out.println(saveContent);
}
}
}
}
다중 catch
try 블록안에서 다양한 예외가 발생했을때, 각각의 예외에 다르게 예외처리를 할 수 있게 한다.
package ex1;
public class CatchByExceptionKindExam {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("실행 매개값의 수가 부족합니다.");
System.out.println("[실행 방법]");
System.out.println("java TryCatchFinallyExceptionExam num1 num2");
return;
}catch (NumberFormatException e){
System.out.printf("숫자로 변환할 수 없습니다");
}finally {
System.out.println("다시 실행하세요");
}
}
}
ArrayIndexOutOfBoundsException도 Exception을 상속을 해서 만든 것.
catch는 상속된 하위가 부모보다 위에 위치해야한다.
잘못된 예제 ↓
올바른 예제 ↓
package ex1;
public class CatchByExceptionKindExam {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("실행 매개값의 수가 부족합니다.");
System.out.println("[실행 방법]");
System.out.println("java TryCatchFinallyExceptionExam num1 num2");
return;
}catch (Exception e){
System.out.printf("숫자로 변환할 수 없습니다");
}finally {
System.out.println("다시 실행하세요");
}
}
}
멀티 catch
하나의 catch 블록에서 여러개의 예외 처리 가능 , 동일하게 처리하고싶은 예외를 |로 연결
package ex1;
public class MultiExceptiom {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
}catch (ArrayIndexOutOfBoundsException | NumberFormatException e){
System.out.println("실행 매개값의 수가 부족하거나 숫자로 변환할 수 없음.");
}catch (Exception e){
System.out.printf("알수 없는 예외 발생");
}finally {
System.out.println("다시 실행하세요");
}
}
}
Try-with-resources
예외 발생 여부와 상관없이 사용했던 리소스객체 (각종 입출력스트림, 서버소켓, 소켓, 각종채널)의
close()메소드를 호출해서 안전하게 리소스를 닫아준다.
package ex2;
public class FileInputStream implements AutoCloseable{
private String file;
public FileInputStream(String file){
this.file = file;
}
public void read(){
System.out.println(file+"을 읽습니다.");
}
//강제적으로 예외를 발생시켜서, close()가 자동생성된다
@Override
public void close() throws Exception {
System.out.println(file+"을 닫습니다.");
}
}
FileInputStream 파일로 부터 바이트로 입력받아, 바이트 단위로 출력할 수 있는 클래스이다.
FileInputSteam은 텍스트의 값을 내뿜을때 양수로 계속나오다가. 더이상 나올게 없으면 -1이 나온다.
.read()메소드는 FileOutputStream을 읽어주는 메소드이다.
package ex2;
public class TryWithResourcesExample {
public static void main(String[] args) {
//FileInputStream이라는게 file.text를 읽는 것
try(FileInputStream fis = new FileInputStream("file.txt")) {
fis.read();
throw new Exception();
//강제적으로 예외발생을 만드는 코드
}catch (Exception e){
System.out.println("예외 처리 코드가 실행되었습니다.");
}
}
}
throw 키워드를 사용하여 프로그래머가 고의로 예외를 발생시킬수 있다.
예외 떠 넘기기 throws
메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기기는 역할
package ex3;
public class ThrowsExample {
public static void main(String[] args) {
try {
findClass();
}catch (ClassNotFoundException e){
System.out.println("클래스가 존재하지 않습니다");
}
}
public static void findClass()throws ClassNotFoundException{
Class clazz = Class.forName("java.lang.String2");
}
}
사용자 정의 예외 클래스 선언
예외가 발생하는 코드가 아닌데, 사용자가 임의로 정의하여 예외를 만드는 방법
예외 발생시키기 throw
package ex4;
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException(){}
public BalanceInsufficientException(String message){
super(message);
}
}
package ex4;
public class Account {
private long balance;
public Account() { }
public long getBalance() {
return balance;
}
public void deposit(int money) {
balance += money;
}
public void withdraw(int money) throws BalanceInsufficientException {
if(balance < money) {
throw new BalanceInsufficientException("잔고 부족:"+(money-balance)+"모자람");
}
balance -= money;
}
}
package ex4;
public class AccountExample {
public static void main(String[] args) {
Account account = new Account();
//예금하기
account.deposit(10000);
System.out.println("예금액: " + account.getBalance());
//출금하기
try {
account.withdraw(30000);
} catch(BalanceInsufficientException e) {
String message = e.getMessage();
System.out.println(message);
System.out.println();
e.printStackTrace();
}
}
}
getMessage()
왜 발생했다 라는 문자정보 - 예외처리할때 주로쓰임
printStackTrace()
예외발생코드를 추적한 정보를 전부 알려준다 - 개발할때 주로 쓰임 (사용자가 보기엔 좋지않다.)
package ex4;
public class AccountExample {
public static void main(String[] args) {
Account account = new Account();
//예금하기
account.deposit(10000);
System.out.println("예금액: " + account.getBalance());
//출금하기
try {
account.withdraw(30000);
System.out.println("예금액: "+account.getBalance());
} catch(BalanceInsufficientException e) {
String message = e.getMessage();
// if(message.equals("1004")){...}
// if(message.equals("1005")){...}
System.out.println(message);
System.out.println("--");
System.out.println(e.toString());
System.out.println("--");
e.printStackTrace();
}
}
}
package ex4;
public class Account {
private long balance;
public Account() { }
public long getBalance() {
return balance;
}
public void deposit(int money) {
balance += money;
}
public void withdraw(int money) throws BalanceInsufficientException {
if(balance < money) {
throw new BalanceInsufficientException("잔고부족:"+(money-balance)+" 모자람");
}
balance -= money;
}
}
package ex4;
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException(){}
public BalanceInsufficientException(String message){
super(message);
}
}
이미지출처 : 이것이자바다
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 22-07-20 객체비교 equals() ☑ (0) | 2022.07.20 |
---|---|
[JAVA-이것이자바다.8장] 인터페이스 확인 문제 (0) | 2022.07.19 |
[JAVA-이것이자바다.7장] 상속 확인 문제 (0) | 2022.07.18 |
[JAVA] 22-07-18 익명 객체 ☑ (0) | 2022.07.18 |
[JAVA] 22-06-13 상수풀 / String · StringBuilder · StringBuffer ☑ (0) | 2022.07.18 |