1. 초기 코드
//IOT 작동 소스코드 2
//이사갈 때 id값 직접 수정 및 컴파일 : 복잡함
//프로그램 실행 -> 사용자의 주소 직접 입력 -> 아이디값 세팅식으로 바꾸기
import javax.swing.JOptionPane; //JOptionPane 기능 사용하기 위한 swing 기능 추가
import org.opentutorials.iot.Elevator;
//org 패키지 내 opentutorials 내 iot 내 Elevator 소스코드를 가져와서 쓰겠다는 의미.
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;
public class OkJavaGoinHomeinput {
public static void main(String[] args) {
//args : parameter (매개변수)
//프로그램 사용자와 프로그램 사이 값을 매개해줌
//Arguments에 입력된 값이 args로 들어오게 됨.
//값이 2개이기 때문에 문자열로 받을 수 없어서 문자열 뒤 []붙임
//string[] : 문자열로만 이루어진 배열 데이터
//args 뒤 {} 안에서는 args가 유저가 입력한 값임.
System.out.println("Country : "+args[1]); //이 부분을 추가했는데 에러가 났다.
String id = args[0];
//args에서 첫 번째 값 : 0 (프로그램은 0부터 시작)
//String id = JOptionPane.showInputDialog("Enter your Address");
//JOptionPane는 우리가 사용할 수 없음.
//따라서 마우스 위에 올리고 import joptionpane 클릭하면 맨 위에 swing 기능 생김.
//showInputDialog : 사용자가 id 입력할 수 있는 창이 뜸.
String bright = args[1];
//두 번째 값 : 1
//String bright = JOptionPane.showInputDialog("Enter a Bright level");
//유저가 입력한 수치값은 string임. (double x) -> string을 double형으로 converting해야함.
//Elevator call
Elevator myElevator = new Elevator(id);
//myElevator : 변수명, Elevator : 변수 타입
myElevator.callForUp(1);
//Security off
Security mySecurity = new Security(id);
mySecurity.off();
//Light on
Lighting hallLamp = new Lighting(id+" / Hall Lamp");
hallLamp.on();
Lighting floorLamp = new Lighting(id+" / floorLamp");
floorLamp.on();
//입력값 여러개 한꺼번에 넣고 싶을 때.
//밝기 조절 가능한 램프 가정
DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
moodLamp.setBright(Double.parseDouble(bright)); //10%만큼 밝기
//setBright(brignt) = double형이 온다고 에러 남.
//parse : 분석하다.
//string bright값 -> double형 bright값 : 에러 x
moodLamp.on();
}
}
21번 줄 코드를 추가했더니 아래와 같이 에러가 났다.
(소스코드명) at localhost:53124 contains obsolete methods.
Reason:
The virtual machine was unable to remove all stack frames running old code from the call stack.
The virtual machine is not supplying the devugger with valid data for those frames.
Stepping into these obsolete frames may be hazardous to the target virtual machine.
(소스코드명) localhost:53124는 쓸모없는 method들이 포함되어 있다.
원인:
가상 컴퓨터는 모든 스택 프레임들을 제거할 수 없다. 이전 코드에서 실행 중인. 호출 스택에서.
가상 컴퓨터는 호출 스택으로부터 이전 코드에서 실행 중인 모든 스택 프레임들을 제거할 수 없다.
가상 컴퓨터는 디버거를 제공하지 않는다. 유효한 데이터를. 저 프레임들에 대한.
가상 컴퓨터는 저 프레임들에 대한 유효한 데이터를 디버거에 제공하지 않는다.
이러한 쓸모없는 프레임들을 시작하는 것은 위험할지도 모른다. 타겟 가상 컴퓨터에.
(타겟 가상 컴퓨터라... '나의' 가상 컴퓨터를 말하는 것같다.)
이러한 쓸모없는 프레임들을 시작하는 것은 타겟 가상 컴퓨터에 위험할지도 모른다.
💡 obsolete : 쓸모없는
💡 valid : 유효한
💡 hazardous : 위험한
💡 step into : 시작하다
👉🏻 추가한 코드에 문제가 있는 것 같다.
쓸모없는 프레임, 이전 코드에서 실행 중인 스택 프레임들을 제거할 수 없다는 문장에서 유추해본다면
이전 코드에서 작성한 어느 코드 줄이 지금 추가한 코드와 부딪히는 것 같다.
[해결 시도]
1. 구글 서치
"java at localhost:53124 error"
구글 서치해도 나오지 않았다.
뭐가 문제인 걸까
2. 이클립스 설명 자세히 보기
5번 줄 코드 import javax.swing.JOptionPane; 에서 에러가 났다.
The import javax.swing.JOptionPane is naver used
4 quick fixes available:
Remove unused import
Organize imports
Add @SuppressWarnings 'unused' to '(소스코드명)'
Configure problem severity
import javax.swing.JOptionPane;는 사용되지 않는다.
신속한 해결 가능한 4가지:
사용하지 않는 import 제거
import 정리
@SuppressWarnings의 '사용하지 않음'을 (소스코드명)에 추가
문제 심각도 구성
💡 Organize : 정리하다, 준비하다, 체계를 잡다
💡 Suppress : 억압하다
💡 Configure : 구성
💡 severity : 엄격, 괴로움, 심각도
갑자기 작동하는데 필요하던 import 코드가 필요하지 않다고 나왔다.
3. 소스코드 주의깊게 보기
//21번 줄 코드 (new code)
System.out.println("Country : "+args[1]);
//29번 줄 코드 (old code)
String bright = args[1];
두 코드가 눈에 들어왔다.
args[1]이 겹쳤다.
args라는 것은 변수값을 유저가 입력하면 그 값이 args로 들어오는 parameter이다. (매개변수)
public static void main(String[] args) { 부분에서 중괄호 열고 닫기까지의 코드들에 입력된 값이
args에 들어간다.
그런 값이 중복되면 에러가 생기는 것이 아닐까 추측해본다.
그래서 29번 줄 코드를 주석처리하고 실행하였다.
👉🏻 그래도 에러가 났다. 이게 문제가 아닌 것 같았다.
💡 이게 문제가 아니다. 오히려 해당 부분 숫자가 다르면 에러가 났다.
에러 처리는 아래서 계속 하겠다.
4. 이클립스 에러 알림 활용
//IOT 작동 소스코드 2
//이사갈 때 id값 직접 수정 및 컴파일 : 복잡함
//프로그램 실행 -> 사용자의 주소 직접 입력 -> 아이디값 세팅식으로 바꾸기
//import javax.swing.JOptionPane; //JOptionPane 기능 사용하기 위한 swing 기능 추가
import org.opentutorials.iot.Elevator;
//org 패키지 내 opentutorial 내 iot 내 Elevator 소스코드를 가져와서 쓰겠다는 의미.
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;
public class OkJavaGoinHomeinput {
public static void main(String[] args) {
//args : parameter (매개변수)
//프로그램 사용자와 프로그램 사이 값을 매개해줌
//Arguments에 입력된 값이 args로 들어오게 됨.
//값이 2개이기 때문에 문자열로 받을 수 없어서 문자열 뒤 []붙임
//string[] : 문자열로만 이루어진 배열 데이터
//args 뒤 {} 안에서는 args가 유저가 입력한 값임.
System.out.println("Country : "+args[1]);
String id = args[0];
//args에서 첫 번째 값 : 0 (프로그램은 0부터 시작)
//String id = JOptionPane.showInputDialog("Enter your Address");
//JOptionPane는 우리가 사용할 수 없음.
//따라서 마우스 위에 올리고 import joptionpane 클릭하면 맨 위에 swing 기능 생김.
//showInputDialog : 사용자가 id 입력할 수 있는 창이 뜸.
//String bright = args[1];
//두 번째 값 : 1
//String bright = JOptionPane.showInputDialog("Enter a Bright level");
//유저가 입력한 수치값은 string임. (double x) -> string을 double형으로 converting해야함.
//Elevator call
Elevator myElevator = new Elevator(id);
//myElevator : 변수명, Elevator : 변수 타입
myElevator.callForUp(1);
//Security off
Security mySecurity = new Security(id);
mySecurity.off();
//Light on
Lighting hallLamp = new Lighting(id+" / Hall Lamp");
hallLamp.on();
Lighting floorLamp = new Lighting(id+" / floorLamp");
floorLamp.on();
//입력값 여러개 한꺼번에 넣고 싶을 때.
//밝기 조절 가능한 램프 가정
/*DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
moodLamp.setBright(Double.parseDouble(bright)); //10%만큼 밝기
//setBright(brignt) = double형이 온다고 에러 남.
//parse : 분석하다.
//string bright값 -> double형 bright값 : 에러 x
moodLamp.on();*/
}
}
문제가 된 것은 아래와 같다.
//5번 줄 코드
import javax.swing.JOptionPane;
5번 줄 코드에서 JOptionPane swing 기능을 사용하지 않기 때문에 import 코드가 필요 없었다.
5. args[1]은 맞는 부분이다.
args[1]이 정말 겹쳐서 에러가 난 것일까?
궁금해서 29번 줄 코드 중 args[1]을 args[2]로 바꾸고 컴파일했다.
에러가 났다.
이때, 아래의 코드를 유심히 볼 필요가 있다.
//21번 줄 코드
System.out.println("Country : "+args[1]);
//22번 줄 코드
String id = args[0];
//29번 줄 코드 (old code)
String bright = args[1];
21번 코드)
지역과 args[1]에 들어있는 값을 함께 출력하라는 메시지가 된다.
22번 코드)
string 형식의 id 변수값은 args[0]이다.
29번 코드)
string 형식의 bright 변수값은 args[1]이다.
💡 21번 코드의 args[1]은 29번 코드의 args[1]값을 그대로 가져와 "Country : "와 함께 출력하라는 의미였던 것이다.
예를 들면 29번 코드의 args[1]값이 20이라 가정하면, 21번 코드의 출력값은 "Country : 20"이 되는 것이다.
생활코딩으로 자바 입문을 공부하다가 같은 코드를 여러 번 바꿨던 강의 덕분에
의문점을 제기할 수 있었고, 해결까지 할 수 있었다.
별 것도 아닌 것으로 삽질을 좀 했지만 이제 에러 해결 삽질 과정의 시작이라고 보고
앞으로도 힘을 내서 열심히 해결하려 노력해야겠다.
아직 초보이기에 엉망진창이지만 언젠가는 성장하게 되겠지.
'[Language] > Java | Spring | JSP' 카테고리의 다른 글
[백준]2557: Hello World (0) | 2022.04.13 |
---|---|
[생활코딩]회계 앱 만들기_입출력 프로그램 추가 (0) | 2022.04.12 |
[생활코딩]회계 앱 만들기_기본 (0) | 2022.04.12 |
[생활 코딩]자바 입문 (0) | 2022.04.09 |
JAVA debugging (자바 디버깅) (0) | 2022.04.09 |