【问题标题】:Strange uncaught error with GWT, UmbrellaExceptionGWT 出现奇怪的未捕获错误,UmbrellaException
【发布时间】:2020-02-25 14:57:36
【问题描述】:

我正在通过 GWT 和 Eclipse 构建一个项目,以实现类似于 Yahoo Answer 的网站,直到几天前它运行良好,但从昨天开始我注意到一个我以前没有看到的错误,它非常奇怪,因为我会注意到。基本上在谷歌浏览器的控制台上,当我尝试可视化与问题相关的答案时,我收到一个未捕获的错误,似乎数据库(mapdb 1.0.9)没有返回任何内容

对于兼容性问题,我将 Eclipse Mars 用于 Java 7 (1.7) 和 GWT 2.8.0 没有复制的部分代码我会通过点击问题贴出来

  public class MostraRisposte {

private VerticalPanel verticalPanel = null;


public MostraRisposte(VerticalPanel verticalPanel) {
    this.verticalPanel = verticalPanel;
}

public void onModuleLoad(Domanda currentSelection) {

    this.verticalPanel.add(new HTML("<br>"));
    this.verticalPanel.add(new HTML("<br>"));
    final Grid answerGridPanel = new Grid(8, 2);
    answerGridPanel.setWidget(0, 0, new Label("Utente: "));
    answerGridPanel.setWidget(0, 1, new Label(currentSelection.getUserName()));
    answerGridPanel.setWidget(1, 0, new Label("Testo:  "));
    answerGridPanel.setWidget(1, 1, new Label(currentSelection.getText()));
    answerGridPanel.setWidget(2, 0, new Label("Data: "));
    answerGridPanel.setWidget(2, 1, new Label(currentSelection.getDay()));
    answerGridPanel.setWidget(4, 0, new Label("Link1: "));
    answerGridPanel.setWidget(4, 1, new Label(currentSelection.getLinkList().get(0)));
    answerGridPanel.setWidget(5, 0, new Label("Link2: "));
    answerGridPanel.setWidget(5, 1, new Label(currentSelection.getLinkList().get(1)));
    answerGridPanel.setWidget(6, 0, new Label("Link3: "));
    answerGridPanel.setWidget(6, 1, new Label(currentSelection.getLinkList().get(2)));
    answerGridPanel.setWidget(7, 0, new Label("Link4: "));
    answerGridPanel.setWidget(7, 1, new Label(currentSelection.getLinkList().get(3)));
    this.verticalPanel.add(answerGridPanel);
    final GwaServiceAsync gwanswer = GWT.create(GwaService.class);
    final int id = currentSelection.getIdQuestion();
    gwanswer.ordinaRisposte(id, new AsyncCallback<List<Risposta>>() {

        @Override
        public void onFailure(Throwable caught) {
            PopupPanel popup = new PopupPanel(true);
            popup.setWidget(new HTML("<font color='red'>Errore</font>"));
            popup.center();
        }

        @Override
        public void onSuccess(List<Risposta> response) {
            final CellTable<Risposta> questionsTable = new CellTable<>(20);
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getText();
                }
            }, "Risposta");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta answer) {
                    return answer.getUserName();
                }
            }, "Utente");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getDay();
                }
            }, "Giorno");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getTime();
                }
            }, "Ora");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getJudgeEmail();
                }
            }, "Giudice");
            final TextColumn<Risposta> ratingTextColumn = new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getRating();
                }
            };
            questionsTable.addColumn(ratingTextColumn, "Voto");
            ratingTextColumn.setSortable(true);
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(0);
                }
            }, "Link");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(1);
                }
            }, "Link");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(2);
                }
            }, "Link");
            questionsTable.addColumn(new TextColumn<Risposta>() {
                @Override
                public String getValue(Risposta risposta) {
                    return risposta.getLinkList().get(3);
                }
            }, "Link");
            final ListDataProvider<Risposta> dataProvider = new ListDataProvider<>();
            dataProvider.addDataDisplay(questionsTable);
            final List<Risposta> list = dataProvider.getList();
            for (Iterator<Risposta> iterator = response.iterator(); iterator.hasNext();) {
                final Risposta risposta = iterator.next();
                list.add(risposta);
            }
            final ListHandler<Risposta> columnSortHandler = new ListHandler<>(list);
            columnSortHandler.setComparator(ratingTextColumn, new Comparator<Risposta>() {
                @Override
                public int compare(Risposta option1, Risposta option2) {
                    if (option1.getRating().equals(option2.getRating())) {
                        if (!option1.getDate().after(option2.getDate())) {
                            return -1;
                        } else {
                            return 1;
                        }
                    } else {
                        return (option2 != null && option1 != null) ? option1.getRating().compareTo(option2.getRating())
                                : 1;
                    }
                }
            });
            questionsTable.addColumnSortHandler(columnSortHandler);
            questionsTable.getColumnSortList().push(ratingTextColumn);
            questionsTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
            final SingleSelectionModel<Risposta> selectionModel = new SingleSelectionModel<>();
            questionsTable.setSelectionModel(selectionModel);
            selectionModel.addSelectionChangeHandler(new Handler() {
                @Override
                public void onSelectionChange(SelectionChangeEvent event) {
                    if (UtenteAttuale.accountType == 1) {
                        final Risposta currentSelection1 = selectionModel.getSelectedObject();
                        if (currentSelection1 != null) {
                            final AggiungiVoto iv = new AggiungiVoto(MostraRisposte.this.verticalPanel);
                            iv.onModuleLoad(currentSelection1);
                        }
                    }
                }
            });
            questionsTable.setRowCount(response.size(), true);
            questionsTable.setRowData(0, response);
            MostraRisposte.this.verticalPanel.add(questionsTable);
        }
    });
}

}

我希望显示一个网格 (Grid),其中包含谁提出了我选择的问题 (CurrentSelection) 的信息,并在包含答案的表格的正下方,我检查了问题和答案正确输入到数据库中,但不幸的是只有没有出现答案。

Chrome 控制台上的错误:

【问题讨论】:

  • 检查源下的“捕获异常时暂停”。在开发工具打开的情况下运行您的代码。现在,调试器将在失败的语句处停止。检查你的数据...
  • questionsTable 列中,您执行return risposta.getLinkList().get(2);。你确定linkList 有这么多项目吗?在尝试读取之前尝试检查risposta.getLinkList() 大小。

标签: java eclipse google-chrome gwt gwt-rpc


【解决方案1】:

尝试捕获所有未捕获的异常,然后打开保护伞。

在 onModuleLoad 方法的开头某处

GWT.setUncaughtExceptionHandler(e -> showError(e));

在 showError 中做类似的事情

Throwable unwrapped = unwrap(e); 
GWT.log("Uncaught exception catched", unwrapped);


/**
 * Unwrap the given exception.
 * @param e The exception.
 * @return Unwrapped version of the exception
 */
private static Throwable unwrap(Throwable e)
{
   if (e instanceof UmbrellaException)
   {
      UmbrellaException ue = (UmbrellaException) e;
      if (ue.getCauses().size() == 1)
      {
         return unwrap(ue.getCauses().iterator().next());
      }
   }
   return e;
}

这样你就可以有一个更清晰的堆栈跟踪来查看发生了什么。

【讨论】:

  • 现在在 Chrome 控制台中我有这个异常:异常:java.lang.IndexOutOfBoundsException:索引:2,大小:2
  • 这是完全的例外吗?你没有看到“Uncaught exception catched”文本(如果你在 GWT.log 语句中使用过)。
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2016-09-06
  • 1970-01-01
  • 2015-09-11
  • 2011-01-08
相关资源
最近更新 更多