捕获web start java小程序的异常

捕获web start java小程序的异常,java,javascript,exception,web,Java,Javascript,Exception,Web,我使用Oracle的deployJava.js在我的网站上启动了一个java小程序 var attributes = { id:'applet', code:'dummy.Applet.class', archive: contextPath + '/jar/JAR_NAME.jar', width:1, height:1

我使用Oracle的deployJava.js在我的网站上启动了一个java小程序

    var attributes = {  id:'applet', 
                    code:'dummy.Applet.class',
                    archive: contextPath + '/jar/JAR_NAME.jar',
                    width:1, 
                    height:1
                } ;
var parameters = {jnlp_href: 'Applet.jnlp',
                        baseUrlParam: baseUrl,
                        serverConnectionType: 'REST',
                        java_status_events: 'true'
                } ;
deployJava.runApplet(attributes, parameters, '1.6');
问题是,如果我从javascript调用java函数,小程序抛出RuntimeException,我就无法在javascript的try-catch中捕捉到这一点。每次我只捕获“未捕获的错误:在NPObject上调用方法时出错。”错误

例如:

我在javascript中调用此函数:

function getConfirmation(){    
    applet.confirmation()
}
然后小程序在没有try-catch块的情况下抛出ApplicationBaseException。我可以看到两个错误:

Uncaught Error: dummy.ApplicationBaseException         toperson.js:78
                getConfirmation                        toperson.js:78
                (anonymous function)                   toperson.js:53
                b.event.dispatch                jquery-1.9.1.min.js:3
                v.handle                        jquery-1.9.1.min.js:3

Uncaught Error: Error calling method on NPObject.
                getConfirmation
                (anonymous function)                   toperson.js:53
                b.event.dispatch                jquery-1.9.1.min.js:3
                v.handle                        jquery-1.9.1.min.js:3
但是使用try-catch块,我只能捕获NPObject错误


如何捕获Java脚本中的另一个错误?

我们使用一个小包装器来解决这个问题:

public class JSWrapper {

    private Object returnVal;
    private Exception exception;

    public void setRV(Object returnVal) {
        this.returnVal = returnVal;
    }

    public Object getRV() {
        return this.returnVal;
    }

    public void setException(Exception exception) {
        this.exception = exception;             
    }

    public Exception getException() {
        return this.exception;              
    }

}
javascript调用的方法应如下所示:

public JSWrapper selectFolder(){
    final Applet applet = this;
    return AccessController.doPrivileged(new PrivilegedAction<JSWrapper>() {
        public JSWrapper run() {
            JSWrapper wrap = new JSWrapper();
            try{        
                JFileChooser folderchooser = new JFileChooser();
                int returnValue = folderchooser.showSaveDialog(applet);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    wrap.setRV(folderchooser.getSelectedFile().getAbsolutePath());
                } else {
                    wrap.setRV(null);
                }
            } catch (ApplicationBaseException e) {
                wrap.setRV(null);
                wrap.setException(e);                   
            } catch (Exception e2) {
                wrap.setRV(null);
                wrap.setException(e2);  
            }               
            return wrap;
        }
    });                     
}
var folderResult = applet.selectFolder();
if (folderResult.getException()) {
    throw new Exception(folderResult.getException());
}       
if(folderResult.getRV()){
    alert("Folder selected:" + folderResult.getRV());
}