【问题标题】:Java catching exceptions inside a class called from a swingworkerJava 在从 swingworker 调用的类中捕获异常
【发布时间】:2017-07-01 20:15:51
【问题描述】:

好吧,我有这个代码:

SwingWorker<Void,Void> worker = new SwingWorker<Void, Void>() {
   @Override
   public Void doInBackground() {
       Connection checker = new Connection();
       do{
           checker.checkConnection();
       }while(true);
   }}

方法如下

checkConnection()

public void checkConnection(){
do{
    try{
        URL url = new URL("http://www.google.com");
        URLConnection uc = url.openConnection();
        BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
                    System.out.println("You're connected");
        }
        online = true;
    }catch(Exception noConnessione){
        System.out.println("No connection..."); 
        System.out.println("I'm going to try again in 30s...");
        robot.delay(30000);
        online = false;
    }
}while(online == false);}

好吧,如果没有连接,它就不会进入 catch 块,但如果我在没有 swingworker 的情况下使用相同的代码,它就会进入。

我绝对需要swingworker,我该如何解决这个问题?

【问题讨论】:

  • Swing 工作者按预期工作。我想你需要发布完整的代码。也许其他地方有错误。
  • @mko:从来没有完整代码,但如果可能的话,总是一个像样的minimal reproducible example
  • 哇,机器人只是为了避免 InterruptedException?但说真的,不确定尽可能多地连接到 Google 是否是个好主意,至少在成功连接后也插入一些延迟
  • @CarlosHeuberger 机器人做的远不止这些,我只是尝试发布最少的代码,是的,在整个版本中也有延迟。
  • 机器人部分并不是认真的,;很久以前,我只是花了一些时间考虑使用它来忽略 InterruptedException ......无论如何,这个最小的代码是否也会出现问题?它对我有用。

标签: java exception swingworker


【解决方案1】:

似乎工作正常

import javax.swing.SwingWorker;
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Simple {

  public static void main(String [] arg) {
    System.out.println("Starting worker");
    SwingWorker<Void,Void> worker = new SwingWorker<Void, Void>() {
      @Override
      public Void doInBackground() {
        Connection checker = new Connection();
        do{
          System.out.println("Running routine test");
          checker.checkConnection();
        }while(true);
      }
    };
    worker.execute();
    while(true);
  }
}

class Connection {
  boolean online = false;
  public void checkConnection() {
    System.out.println("Check connection loop");
    while(online == false) {
      try{
        URL url = new URL("http://yyy.google.com");
        URLConnection uc = url.openConnection();
        BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
                    System.out.println("You're connected");
        }
        online = true;
      }catch(Exception noConnessione){
        online = false;
      }
      if(online == false) {
        try {
          System.out.println("No connection...");
          System.out.println("I'm going to try again in 3s...");
          System.out.flush();
          Thread.sleep(3000);
        } catch(InterruptedException ex) {
          System.out.println("I was awaken");
        }
      }
    }
  }
}

执行如下

> javac Simple.java
> java Simple
Starting worker
Running routine test
Check connection loop
No connection...
I'm going to try again in 3s...
No connection...
I'm going to try again in 3s...
No connection...
I'm going to try again in 3s...
No connection...
I'm going to try again in 3s...
No connection...
I'm going to try again in 3s...

【讨论】:

    【解决方案2】:

    看起来有一个未捕获的异常/错误正在中止doInBackground 方法。这个异常会被 Swingworker 静默捕获,并且仅在调用 get 方法时报告。

    get 方法将阻塞,直到 SwingWorker 终止,这在上面的代码中不打算出现(永远循环)。所以调用应该是被覆盖的donemethod内的模式:

    SwingWorker<Void,Void> worker = new SwingWorker<Void, Void>() {
        @Override
        public Void doInBackground() throws Exception {
            ...
        }
        @Override
        public void done() {
            try {
                get();
            } catch (InterruptedException | ExecutionException ex) {
                ex.printStackTrace();
                // TODO
            }
        }
    };
    

    但请注意done 在事件调度线程上执行!

    替代方案,将doInBackground全部内容放在 try-catch 中:

        @Override
        public Void doInBackground() throws Exception {
            try {
                ...
            } catch (Throwable ex) {
                ex.printStackTrace();
                throw ex;
            }
        }
    

    不是解决方案,但应该有助于找到错误,因此希望是解决方案

    【讨论】:

    • 太好了,谢谢你!使用 get() 解决了它;我有一个未处理的 nullpointerexception 并使用 get() 方法我有堆栈跟踪来找出问题。再次感谢您!
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多