[英]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.