2012-11-28 3 views
0

BufferedReader.readline()의 예외를 잡는 방법을 소켓에서 데이터를 읽는 (의이 T1 가정 해 봅시다) 그것의 방법 중 하나에서. 여기자바 소켓 I는 스레드가

T1.running = false; 
socket.close(); 

을 나는 해결책을 찾을 수있는 시나리오이다 : 따라서, T2는 다음을 수행

  • T1이 활성화되고 어떤 입력을 대기하는 단계, 즉 차단 읽어.
  • 컨텍스트 스위칭
  • T2가 활성 false로 실행 세트,
  • T1 차단하고, T2 소켓 폐쇄 때문에이 T1가 예외를 발생 전환 소켓
  • 컨텍스트를 닫는다. 내가 원한 것은이 SocketException을 잡는 것이다. 나는 T1.run()에 try/catch (SocketException)를 넣을 수 없다. 어떻게 T1의 실행 방법에서 그것을 잡을 수 있습니까? T1이 실행 중일 때 그것을 잡을 수 없다면 다른 곳에서 어떻게 잡을 수 있습니까?

PS : 내가 단계별로 코드 단계를 디버깅 할 때
"스레드 디버깅에 대한 또 다른 질문은"일반적으로, 내가 컨텍스트 스위치의 '실행중인 활성 라인'을 잃게됩니다. 내가 T1의 20 행에 있다고 가정 해 봅시다. 컨텍스트 스위치가 발생합니다. 프로그램이 T2의 30 행에서 계속되지만, 디버거가 T2의 30 행에 나타나지 않거나/실행되지 않는다고 가정 해 봅시다. '사라진다. 그래서 코드를 제어 할 수 없게됩니다. Java 용 Eclipse와 C# 용 Visual Studio를 사용합니다. 그렇다면 컨텍스트 스위치에서 디버깅하는 동안 코드를 추적하는 가장 좋은 방법은 무엇입니까?

+1

'SocketException'은'IOException'을 확장합니다. 따라서'catch' 절은'SocketException'을 잡아야합니다. – reprogrammer

+0

T1의'run()'메소드에서'SocketException'을 잡을 수없는 이유는 무엇입니까? (그것은'IOException'의 서브 클래스이기 때문에 기존의'catch' 절에 의해 어쨌든 잡힐 것입니다. 만약 당신이 그것을 따로 잡으려고한다면, 이전의'catch' 절에 그것을 나열하면됩니다.) –

+0

나는 그것을 안다. . 그러나 어쨌든, 나는 왜 프로그램이 그것을 잡지 못하는지 모른다. 내가 거기에 중단 점을 넣는 것을 의미하지만 프로그램은 catch 블록에서 멈추지 않습니다. –

답변

1

당신이 스레드 풀을 사용하고 있다고 가정 할 때 어쩌면 Thread.UncaughtExceptionHandler를 모든 스레드에 설치하고 submit() 대신 ExecutorService에서 작업을 호출하는 ThreadFactory를 만들어야한다고 가정합니다. 내가 같은 시간에 그들 모두를 해결하는 것, 그래서

디버깅하면 문제에 대한 어쩌면 당신은 http://msdn.microsoft.com/en-us/library/ms164746.aspx

1

귀하의 코드를 가지고 여러 가지 다른 문제를 읽어야합니다.

  1. 당신은 BufferedReader 외부 루프를 작성해야합니다. 그렇지 않으면 루프를 돌 때마다 버려지는 버퍼의 데이터가 손실됩니다.
  2. null에 대해 readLine()의 결과를 테스트해야합니다. 가져올 경우 BufferedReader을 닫고 루프를 종료해야합니다.
  3. 예외가 발생하면 BufferedReader도 닫고 루프를 종료해야합니다.

내가 원하는 것은이 SocketException을 잡는 것입니다.

그래서 잡으세요.

T1.run()에 try/catch (SocketException)를 넣을 수 없습니다.

사용자는 필수입니다. 선택의 여지가 없다. 위의 항목 때문에 어쨌든 완전히 다시 작성해야합니다.