簡體   English   中英

Java編譯器正在打印未報告的異常XPathExpressionExeption

[英]Java compiler is printing unreported exception XPathExpressionExeption

我想我已經找到了想要的答案:我想我已經找到了一種解決方案,可以減少代碼量和可讀性。 我在一開始就聲明了變量:

XPathExpression newExpression;

然后創建一個我可以調用的方法:

XPathExpression exprNS = exprNSCreate("/LVOBSLSTR/NameSpace");

public XPathExpression exprNSCreate(String pathToCompile) {
                try {
                        newExpression = xpath.compile(pathToCompile);
                } catch (Exception e) {
                        System.out.println("XPathExpressionException Error " +     e.getMessage());
                        e.printStackTrace();
                }
                return newExpression;
        }
enter code here

我已經多年沒有使用Java了,我一直在寫這段代碼,到目前為止還遠遠沒有完成。 它要做的是將傳出和傳入XML更改為我們的系統。 這樣做的原因是系統是通過規則引擎編寫的,並且變量長度存在一些限制,因此我們正在系統外修復某些問題。

我在任何地方都找不到對我的問題的參考。 問題是Java編譯器抱怨未報告的異常,但是我看不到任何聲明此異常的示例。

如果我更改代碼以嘗試/捕獲,則問題會消失,但我不想為每個xpath表達式進行嘗試/捕獲。

我正在紅帽Linux機器上進行編譯。

有人可以指出正確的方向嗎? 提前致謝。

這是我得到的錯誤:

LVOBSLSTR.java:58: unreported exception javax.xml.xpath.XPathExpressionException; must be caught or declared to be thrown
                XPathExpression exprNS = xpath.compile("/LVOBSLSTR/NameSpace");
                                                  ^
LVOBSLSTR.java:59: unreported exception javax.xml.xpath.XPathExpressionException; must be caught or declared to be thrown
                NodeList listNS = (NodeList) exprNS.evaluate(paramDoc, XPathConstants.NODESET);

這是代碼:

/**
* The LVOBSLSTR class implements the OBSLSTR class  
* it applies XML data translation dependant on the party
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import java.util.ArrayList;

class LVOBSLSTR implements OBSLSTR  {
        Document paramDoc;
        ArrayList<Object> instructionList;
        Element nodeElement;
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();

        public boolean activate() {
                System.out.println("boolean activate");
                if(null==instructionList) {
                        System.out.println("!!! instructionList NULL creating one !!!");
                        instructionList = new ArrayList<Object>();
                        loadXMLparameterFile();
                        System.out.println("AFTER loadXMLparameterFile");
                }
                return true;
        }

        public void beforePost() {
                System.out.println("beforePost");
                OUTBSOAP.statMessageBuffer =     applyInstructions(OUTBSOAP.statMessageBuffer, "OutBound");
        }

        public void afterPost() {
                System.out.println("afterPost");
                OUTBSOAP.statReplyMessage = applyInstructions(OUTBSOAP.statReplyMessage,     "InBound");
        }

        public String applyInstructions(String xmlString, String inOrOut) {
                XPathExpression exprNS = xpath.compile("/LVOBSLSTR/NameSpace");
                NodeList listNS = (NodeList) exprNS.evaluate(paramDoc,     XPathConstants.NODESET);
                return xmlString;
        }


        public void loadXMLparameterFile() {
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                try {
                        System.out.println("try");
                        DocumentBuilder builder = factory.newDocumentBuilder();
                        FileInputStream fis = new FileInputStream("LVOBSLSTR.xml");
                        InputSource is = new InputSource(fis);
                        paramDoc = builder.parse(is);
                } catch (Exception e) {
                        System.out.println("LVOBSLSTR loadXMLparameterFile Error " +     e.getMessage());
                        e.printStackTrace();
                }
        }
}

基本上,異常有兩種類型:已檢查和未檢查的異常。 當發生程序錯誤(例如空指針,零除,非法參數,數組索引超出范圍等)時,將引發未經檢查的異常。

編譯器無法檢查這些異常,因此不會。 受檢查的異常通常是導致程序失敗的外部事件,例如IO錯誤,套接字連接斷開等。當一段代碼可以引發受檢查的異常時,必須在其方法標頭中聲明,否則該方法無法拋出該異常。一個例外。 它可以捕獲此類異常並對其進行處理(例如,修復情況,將其告知用戶等)。

編譯器檢查它的代碼:即,當您的方法可以(直接)拋出異常時,它必須在其方法標頭中報告該異常:您要么必須捕獲並處理它們,要么報告您的方法將該異常傳遞給其調用方(s)。 如果您不這樣做,編譯器將告訴您您忘記報告該異常。 報告只是在方法聲明中添加“引發SuchAndSoException”。 如果操作失敗,編譯器會將其標記為編譯錯誤。

因此,在上述情況下,您要么需要將每個相關方法聲明為“ throws XPathExpressionException”,要么理想地向每個方法添加一個try / catch塊,並在發生錯誤時執行某些操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM