instanceof
Object
- toString()
메서드, equals()
메서드, hashCode()
메서드, clone()
메서드String
, StringBuilder
, StringBuffer
클래스, text block
newInstance()
메서드로 인스턴스 생성, 클래스 정보 알아보기equals()
메서드를 재정의했다면 hashCode()
메서드도 재정의 하여 동일한 hashCode 값이 반환되도록 한다.public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("db.properties");
Properties prop = new Properties();
prop.load(fis);
String dbType = prop.getProperty("DB-TYPE");
UserInfo userInfo = new UserInfo();
userInfo.setUserId("12345");
userInfo.setPassword("!@#$%");
userInfo.setUserName("이순신");
UserInfoDao userInfoDao;
if(dbType.equals("ORACLE")){
userInfoDao = new UserInfoOracleDao();
}
else if(dbType.endsWith("MYSQL")){
userInfoDao = new UserInfoMysqlDao();
}
else{
System.out.println("db support error");
return;
}
userInfoDao.insertUserInfo(userInfo);
userInfoDao.updateUserInfo(userInfo);
userInfoDao.deleteUserInfo(userInfo);
}
}
java.io.FileNotFoundException: db.properties (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
at Part3.ch13.web.userinfo.UserInfoClient.main(UserInfoClient.java:16)
public class UserInfoClient {
public static void main(String[] args) throws IOException {
try {
FileInputStream fis = new FileInputStream("db.properties");
Properties prop = new Properties();
prop.load(fis);
String dbType = prop.getProperty("DB-TYPE");
UserInfo userInfo = new UserInfo();
userInfo.setUserId("12345");
userInfo.setPassword("!@#$%");
userInfo.setUserName("이순신");
UserInfoDao userInfoDao;
if(dbType.equals("ORACLE")){
userInfoDao = new UserInfoOracleDao();
}
else if(dbType.endsWith("MYSQL")){
userInfoDao = new UserInfoMysqlDao();
}
else{
System.out.println("db support error");
return;
}
userInfoDao.insertUserInfo(userInfo);
userInfoDao.updateUserInfo(userInfo);
userInfoDao.deleteUserInfo(userInfo);
} catch (IOException e) {
e.printStackTrace();
}
return;
}
}
이 블로그(https://rollbar.com/blog/java-filenotfoundexception/)를 보고 try-catch
구문을 통해 FileNotFoundException
예외 처리를 하면 된다는 방법을 찾고 코드를 수정해보았으나 여전히 똑같은 오류가 발생했다.
public class UserInfoClient {
public static void main(String[] args) throws IOException {
try {
FileInputStream fis = new FileInputStream("/Users/sum/Documents/Java/src/main/java/db.properties");
Properties prop = new Properties();
prop.load(fis);
String dbType = prop.getProperty("DB-TYPE");
UserInfo userInfo = new UserInfo();
userInfo.setUserId("12345");
userInfo.setPassword("!@#$%");
userInfo.setUserName("이순신");
UserInfoDao userInfoDao;
if(dbType.equals("ORACLE")){
userInfoDao = new UserInfoOracleDao();
}
else if(dbType.endsWith("MYSQL")){
userInfoDao = new UserInfoMysqlDao();
}
else{
System.out.println("db support error");
return;
}
userInfoDao.insertUserInfo(userInfo);
userInfoDao.updateUserInfo(userInfo);
userInfoDao.deleteUserInfo(userInfo);
} catch (IOException e) {
e.printStackTrace();
}
return;
}
}
예전에 전공 시간에 파일 입출력을 다룰 때 c 드라이브부터 다 입력해야 했던 기억이 났다. 그리고 이때의 경험이 맞았다. 파일 이름에서 오류가 났다면, 콘텐츠 루트로부터의 경로로 수정해보고, 여기서 또 오류가 나니 절대 경로를 복사하여 드디어 오류에서 벗어날 수 있었다.
Class c1 = Class.forName("ch04.Person");
Exception in thread "main" java.lang.ClassNotFoundException: ch04.Person
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at Part4.ch04.ClassTest.main(ClassTest.java:8)
Class c1 = Class.forName("Part4.ch04.Person");
앞서 절대경로를 통해 문제를 해결한 바가 있어 클래스 이름을 콘텐츠 루트로부터의 경로 복사 시도 후 소스 루트로부터의 경로 복사를 통해 오류 해결했다. 그런데 예외 발생 오류 문구 마지막 줄에 Part4부터 시작하는 것을 보니 앞으로 ClassNotFoundException
예외 발생 시 파일 경로는 오류 문구를 참조하면 될 것 같다.
private
멤버 변수는 하위 클래스에서 접근할 수 없으므로 외부 클래스에서 접근할 수는 없지만 하위 클래스에서의 접근을 허용하려면 protected
접근 제어자를 사용한다.hashCode()
는 인스턴스의 저장 주소를 반환한다.clone()
메서드의 사용을 허용한다는 의미로 cloneable
인터페이스를 명시해 줌오래 막혀 있던 부분들을 해결하고 보니 별 게 아니었던 것들이라 후련함과 동시에 허탈함이 찾아왔다. 영문서에서도 try-catch만 보고 넘겼는데 til을 작성하려고 다시 페이지에 방문하고 보니 파일 경로가 제대로 작성돼 있는지 확인해보라는 내용이 있었다. 끝까지 읽었더라면 이 문제가 주말 안에는 해결되지 않았을까 하는 아쉬움이 남는다. 그래도 앞으로 오류 발생 시 try-catch로 1차 해결해보고 안 되면 파일 경로를 수정한다는 건 절대 잊지 않을 것 같다. 또한 오류 문구를 잘 읽어보자. 여기서 힌트를 얻을 수 있다. 역시 다 지나고 나서, 해결하고나서야 보이는 거 같다.