프로그래밍 할 때 가장 이상한 일입니다. 예, 나는 프로에서 프로그래밍을 배우지 만, 나는가는 것처럼 배우지 않습니다. 필자는 응용 프로그램을 서버, 메인 쓰레드의 소켓, 읽기는 별도의 클래스와 쓰레드로 처리하고 asynctask를 사용하여 별도의 클래스로 작성한다.설명이 필요합니다
문제는 LocationManager입니다. 나는 서버와 통신하고 명령을 잘 읽고 쓰고, LocationManager와 리스너를 구현했다.
그런 다음 locatinChanged의 새 좌표로 내 textview를 업데이트하는 방법을 구현했습니다. 여태까지는 그런대로 잘됐다. 내가 일식에서 에뮬레이터 컨트롤을 사용하여 좌표를 보낼 때 응용 프로그램이 stringOutOfBoundsException으로 추락했습니다 (3 년 동안 프로그래밍 된 IVE가 지금까지 본 적이 없습니다). 나는 그걸 밟은 코드를 보았다. stacktrace, logcat, 콘솔을 읽고 내가 생각할 수있는 모든 곳을 찾았지만 어디에도 없습니다. 내가 마지막으로 readerthread 느릅 나무에 갔다 때까지 다음과 같습니다
public class ReaderThread extends Thread {
public void run() {
new Thread(new Runnable(){
public void run(){
try {
//Establish a bufferedreader to read from the socket/server.
in = new BufferedReader(new InputStreamReader(socket.getInputStream()), 8 * 1024);
}
catch(Exception e) { e.printStackTrace(); }
//As long as connect is true.
while (connected) {
String line;
try {
//Try to read a line from the reader.
line = in.readLine();
System.out.println(in.readLine());
if (in == null) {
//No one has sent a message yet.
System.out.println("No data recieved");
}
else {
int i = 0;
//As long as someone is sending messages.
while((line = in.readLine()) != null){
//Make a new Message.
Message msg;
msg = new Message();
//Set the object to the input line.
msg.obj = line;
//Set an id so it can be identified in the main class and used in a switch.
msg.what = i;
System.out.println("i is: "+i);
//Send the message to the handler.
Main.this.h.sendMessage(msg);
}
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}).start();
}
문은 서버가 보낸 내용에 따라하지만이 문제와 아무 상관이있다 나는 그 잘라 경우 내가있는 변수입니다.
문제는 괴물입니다. catch가 IOException이면 응용 프로그램이 충돌합니다. 멍청한 행운을 빌어 예외를 Exception으로 변경하고 e.message를 출력하여 오류를 찾아서 원인을 확인합니다. 문제는이 변화가 그것을 고쳤다는 것입니다. 어떻게 IOException을 그냥 평범한 예외로 바꿀 수 있습니까?
IOException의 경우와 마찬가지로 프로그램에서 "오류가 발생하지만 오류가 발생하지 않습니다."라는 예외가 있지만 예외가 있으면 "이제는 잘못 처리 할 수 있습니다."라고 나와 있습니다.
내 앱이 작동하지만이 문제를 파악할 수없는 이유는 무엇이며 어떻게 발생합니까?
코드가 작동한다고 계속해서 말하지만, 이는 틀림없이 거짓이거나, 여기에 있지 않을 것입니다. @twaddington은 문제가 무엇인지 말해주었습니다. IOException 만 잡으면 다른 예외가 발생하면 앱이 중단됩니다. 대신 Exception 잡기는 가능한 모든 예외를 잡아낼 것입니다. 그래서 이상한 일이 있기 때문에가 아니라 모든 가능한 런타임 오류를 무시하고 있기 때문에 앱이 더 이상 충돌하지 않으므로 조용히 계속되지만 불확정 상태가됩니다. – RivieraKid
질문에 대한 오해가있는 것 같습니다. 코드가 작동하기 때문에 나는 여기에 있지만 should shouldnt. 나는 원하는 기능을 가지고있다. 모든 것은해야하는 일을하고 있으며, 이것을 반복해서 시험해보고 있습니다. 서버의 기능에 대한 텍스트 파일을 가진 다른 컴퓨터에서 내 클라이언트와 서버가 나란히 있기 때문에 서버가 응답해야하는 내용을 알고 있습니다. 명령을 보내면 정확한 응답을 얻습니다. 나는 좌표를 설정하고, 나는 응답하는 부분에 if와 intercept를하는 정확한 응답음을 얻는다. 그러나 논리적으로 (나를 위해) 그것은 작동해서는 안됩니다. – Gvs
글쎄, 이건 어때? 모든 예외를 포착하면 스레드를 시작할 수 있지만 예외를 던져 버리는 오류 상태를 올바르게 처리하지 못하고있다. 실제로 예외를 무시하고있다. 스레드가 시작될 수 있으므로 모든 예외를 잡는 것만으로도 사실 무시한 버그를 해결할 수 있다는 인상을줍니다. 원래 코멘트에서 말했듯이, 문제를 무시하고 고치지 않고 있습니다. – RivieraKid