728x90
반응형
Java 자주발생하는 오류 정리 #3
Frequent Java Cleanup Errors #3
IOException
IOException은 입출력 작업 중에 발생하는 예외로, 파일이 존재하지 않거나 파일에 접근할 수 없는 경우 등의 입출력 관련 오류 시 발생합니다.
파일을 열거나 읽거나 쓸 때, 네트워크와의 통신 시, 입출력 작업을 수행하는 도중에 오류가 발생하는 경우 등에 발생합니다.
취약점
- IOException은 보안에 직접적인 영향을 미치지 않지만, 파일 또는 네트워크 상태와 관련하여 예기치 않은 동작을 유발할 수 있으므로 프로그램 안정성에 영향을 미칠 수 있습니다.
오류상황
// 오류예시: 파일을 찾을 수 없는 경우
try {
FileReader fileReader = new FileReader("nonexistent.txt");
} catch (IOException e) {
// 파일이 존재하지 않는 경우 IOException이 발생
e.printStackTrace();
}
솔루션
// 솔루션 1: 파일의 존재 여부를 먼저 확인
File file = new File("nonexistent.txt");
if (file.exists()) {
// 파일이 존재하는 경우에만 파일 읽기/쓰기 작업 수행
try {
FileReader fileReader = new FileReader(file);
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("File not found.");
}
// 솔루션 2: try-catch로 예외 처리
try {
FileReader fileReader = new FileReader("nonexistent.txt");
} catch (IOException e) {
// 예외 처리 또는 기본값으로 대체
e.printStackTrace();
}
솔루션 설명
- 파일을 열기 전에 먼저 파일의 존재 여부를 확인하여 파일이 존재하는 경우에만 파일 읽기/쓰기 작업을 수행합니다.
- try-catch 블록을 사용하여 IOException이 발생하면 catch 블록에서 해당 예외를 처리합니다. 예외가 발생하면 예외 처리 또는 기본값으로 대체하도록 합니다.
SQLException
SQLException은 데이터베이스와 관련된 작업 중에 발생하는 예외로, 데이터베이스에 접속할 수 없거나 쿼리를 실행하는 도중에 오류가 발생하는 경우 등에 발생합니다.
데이터베이스 연결에 실패하거나, 잘못된 SQL 문을 실행하거나, 데이터베이스 서버와의 통신에 문제가 발생하는 경우 등에 발생합니다.
취약점
- SQLException은 데이터베이스 연동 관련 오류이므로, 쿼리 문제 또는 데이터베이스 연결 문제로 인해 악의적인 사용자가 데이터베이스에 접근하여 데이터를 읽거나 조작하는 데 이용될 수 있습니다.
오류상황
// 오류예시: 데이터베이스 연결에 실패하는 경우
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "username", "password");
} catch (SQLException e) {
// 데이터베이스 연결에 실패하는 경우 SQLException이 발생
e.printStackTrace();
}
솔루션
// 솔루션 1: 데이터베이스 연결 시도
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "username", "password");
// 데이터베이스 연결이 성공한 경우 쿼리 실행 등의 작업 수행
} catch (SQLException e) {
// 예외 처리 또는 기본값으로 대체
e.printStackTrace();
}
// 솔루션 2: try-catch로 예외 처리
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "username", "password");
// 데이터베이스 연결이 성공한 경우 쿼리 실행 등의 작업 수행
} catch (SQLException e) {
// 예외 처리 또는 기본값으로 대체
e.printStackTrace();
}
솔루션 설명
- 데이터베이스 연결 시도를 try 블록 안에서 수행하고, 연결에 성공한 경우 쿼리 실행 등의 작업을 수행합니다. SQLException이 발생하면 catch 블록에서 해당 예외를 처리하거나 기본값으로 대체합니다.
- try-catch 블록을 사용하여 SQLException이 발생하면 catch 블록에서 해당 예외를 처리하거나 기본값으로 대체합니다.
InterruptedException
InterruptedException은 쓰레드가 일시 중지(sleep, wait 등)되어 있는 도중에 다른 쓰레드에 의해 인터럽트(interrupt)를 받았을 때 발생하는 예외입니다.
어떤 경우에 잘 발생하는지: 쓰레드가 일시 중지된 상태에서 다른 쓰레드가 해당 쓰레드를 인터럽트하면 발생합니다. 보통 쓰레드가 대기하고 있는 동안 해당 쓰레드를 종료시키기 위해 사용됩니다.
취약점
- InterruptedException은 보안에 직접적인 영향을 미치지는 않지만, 쓰레드 동작에 영향을 주어 악의적인 사용자가 쓰레드 동작을 제어하는 데 사용될 수 있습니다.
오류상황
// 오류예시: 쓰레드 일시 중지 도중 인터럽트를 받는 경우
Thread thread = new Thread(() -> {
try {
Thread.sleep(5000); // 쓰레드를 5초 동안 일시 중지
} catch (InterruptedException e) {
// 쓰레드 일시 중지 도중 인터럽트를 받으면 InterruptedException이 발생
e.printStackTrace();
}
});
thread.start();
thread.interrupt(); // 쓰레드를 인터럽트하여 InterruptedException 발생
솔루션
// 솔루션 1: InterruptedException 예외를 처리하고, 쓰레드를 다시 일시 중지하거나 종료
Thread thread = new Thread(() -> {
try {
Thread.sleep(5000); // 쓰레드를 5초 동안 일시 중지
} catch (InterruptedException e) {
// 쓰레드 일시 중지 도중 인터럽트를 받으면 InterruptedException 예외가 발생
e.printStackTrace();
// InterruptedException을 받았으나 쓰레드 동작 계속 가능하도록 처리
// 예를 들어 다시 일시 중지하거나 종료 등의 작업 수행
Thread.currentThread().interrupt(); // 인터럽트 상태를 재설정하여 쓰레드 동작 가능
}
});
thread.start();
thread.interrupt(); // 쓰레드를 인터럽트하여 InterruptedException 발생
솔루션 설명
- InterruptedException 예외를 catch 블록으로 처리하고, 쓰레드를 다시 일시 중지하거나 종료하는 등의 작업을 수행합니다. 쓰레드가 인터럽트를 받은 경우 다시 쓰레드를 일시 중지하거나 종료하여 원하는 동작을 수행할 수 있도록 합니다.
728x90
반응형