2013-02-04 42 views
6

Tại sao khi tôi quấn một SwingWorker xung quanh mã này, nó không còn báo cáo một ngoại lệ bị ném nữa?Tại sao ngoại lệ Java của tôi không in dấu vết ngăn xếp khi được ném vào trong một SwingWorker?

import java.security.InvalidParameterException; 

import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 

public class Test { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new SwingWorker<Void, Void>() { 

        @Override 
        protected Void doInBackground() throws Exception { 
         IntegerString s = new IntegerString("EIGHT"); 
         return null; 
        } 

       }.execute(); 

      } 

     }); 

    } 

} 

class IntegerString { 

    public IntegerString(String s) { 
     if (!isInteger(s)) { 
      System.out.println("...throwing exception."); 
      throw new InvalidParameterException("Thrown."); 
     } 
     // ... 
    } 

    static boolean isInteger(String str) { 
     if (str == null) { 
      return false; 
     } 
     int length = str.length(); 
     if (length == 0) { 
      return false; 
     } 
     int i = 0; 
     if (str.charAt(0) == '-') { 
      if (length == 1) { 
       return false; 
      } 
      i = 1; 
     } 
     for (; i < length; i++) { 
      char c = str.charAt(i); 
      if (c <= '/' || c >= ':') { 
       return false; 
      } 
     } 
     return true; 
    } 
} 
+1

Nó không được ném hoặc không được báo cáo như bạn mong đợi? –

+0

Nó không được báo cáo. Tôi cho rằng nó đang được ném nhưng stacktrace không in. – sdasdadas

+2

Đoán của tôi là một ngoại lệ vẫn bị ném, nhưng cuộc gọi của trình xử lý nội bộ tới 'doInBackground()' được bao bọc trong câu lệnh try-catch được thiết kế để bỏ qua các ngoại lệ. – Vulcan

Trả lời

8

Bạn phải gọi get() để truy xuất bất kỳ ngoại lệ nào xảy ra trong doInBackground(). Ví dụ: bạn có thể làm điều đó theo phương pháp done(), tức là:

@Override 
protected void done() { 
    try { 
     get(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

Hoàn hảo, cảm ơn! – sdasdadas

+0

@sdasdadas Bạn được chào đón! :) – tenorsax

+0

nhưng ... là ngoại lệ được đăng nhập vào JUL hay cái gì đó tương tự? –

Các vấn đề liên quan