2011-04-30 6 views
0

스레드가 실행되는 동안 발생하는 스레드를 캐치 예외 예외로 해야합니다.
나는 새로운 예외를 던지려고했지만 "보고되지 않은 예외 ... 잡히거나 던져 져야합니다."라는 오류가 표시되지만 .2 그럴 수 없다면 그 이유는 무엇입니까? 이유를 설명 할 수 있다면 캐치 예외 스레드 외부 스레드

여기

try { 


      log("Connecting to Module.."); 
      int no = searchdevices.getSelectedIndex(); 
      String Selectaddress = searchdevices.getString(no); 
      String name = Selectaddress.substring(0, 6); 
      String add = Selectaddress.substring(Selectaddress.indexOf("$") + 1); 
      if (no == -1) { 
       Alert al = new Alert("Warning", "" + no, null, AlertType.WARNING); 
       al.setTimeout(3000); 
       display.setCurrent(al); 
      } 
      final String fdata2 = "btspp://" + add + ":1;master=false;encrypt=false;authenticate=false"; 
      finalurl = fdata2; 
      fbtname = name; 
      // fbtadd = add; 
      new Thread(new Runnable() { 

       public void run() { 
        try { 

         isConnOpen = true; 
         stream = (StreamConnection) Connector.open(fdata2); 
         in = stream.openInputStream(); 
         out = stream.openOutputStream(); 
         url2 = fdata2; 

         GoTo_Success(); 

        } catch (IOException ex) { 

         throw new Exception();//in side exception 
        } 
       } 
      }).start(); 
     } catch (Exception e) { 
      log("Please switch on bluetooth and then try again"); // want to catch here.. 
     } 

가 감사 내 코드입니다.

+0

예외를 발생시키려는 코드를 보여주십시오. –

+0

코드를 넣습니다. – Nirav

답변

1

음 스레드가 코드가 예외를 잡을 수있는 방법을 실행하는 동시에 실행 주어진 :

다음 링크를 참조하십시오? start()를 호출하면 쓰레드가 시작되고 (아마도 호출 한 후 어떤 시점에서) 프로그램의 나머지 부분은 catch를 지나쳐갑니다.

예를 들어, 스레드는 "foo"라는 메서드로 만들어지고 시작됩니다. 일단 시작하면 foo 메소드가 끝나고 그 메소드를 호출 한 곳으로 돌아갑니다. 그런 다음 메서드 "막대"를 호출합니다. 그 시점에서 새 스레드는 실제로 실행되도록 예약되어 있으므로 "bar"메서드가 일시 중단되고 Thread의 run 메서드가 실행됩니다. 이제 예외가 발생합니다. 이 프로그램은 당신이하려고하는 캐치에서 멀리 떨어져 있습니다. 프로그램의 일부가 아니더라도 잠 들어 있습니다.

+0

네, 맞습니다.우리는 현재 나 미래를 다룰 수있는 과거 만 처리 할 수 ​​없습니다. 내가 맞습니까? – Nirav

+0

java.util.concurrent 패키지 (http://download.oracle.com/javase/tutorial/essential/concurrency/executors.html)를 살펴보십시오. 나는 당신이 현재/미래의 비트를 말할 수 있다고 생각한다. – TofuBeer

1

catch에서 새 예외를 throw하면 try..catch를 사용하여 예외를 처리해야합니다.

이 시도 : 예외가이 절을 던졌습니다 사용하여 메소드 선언에서 선언해야

new Thread(new Runnable() { 

      public void run() { 
       try { 

        isConnOpen = true; 
        stream = (StreamConnection) Connector.open(fdata2); 
        in = stream.openInputStream(); 
        out = stream.openOutputStream(); 
        url2 = fdata2; 

        GoTo_Success(); 

       } catch (IOException ex) { 

        try { 
        throw new Exception(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       }//in side exception 
       } 
      } 
     }).start(); 
+0

네,하지만 아래에 또 다른 잡기가 있습니다 "}). start();", 나는 예외를 잡기 원합니다. 나는 논평에서 언급했다. – Nirav

+0

@Nirav : 새로운 Runnable 클래스를 만들고 그 내부에서 메소드를 재정의하는 것이 원인 일 수 없습니다. 따라서 모든 예외는 해당 클래스에서만 처리되어야합니다. –

+0

예. 나는 이해했다. 답변 감사합니다. – Nirav

0

다른 스레드에서 예외에 대한 알림을 받으려면 수동으로 예외를 전송해야합니다.

예를 들어 Queue<Exception> 또는 이와 비슷한 것을 사용하면 작업자 스레드가 오는 모든 예외를 포착하여 대기열에 추가합니다.

"주 스레드"(또는 특수 예외 처리기 스레드 또는 UI 스레드 또는 ...)는 정기적으로 대기열을 폴링하여 새로운 예외가 있는지 확인한 다음 표시 할 수 있습니다 그것은 사용자에게.