練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術
關於try catch 的問題? RSS feed
Forum Index » 網頁程式設計 Web Development
Author Message
crc2121

九級學員

Joined: 2011/1/17
Messages: 10
Offline
我弄個詢問功能且會顯示出來,如下所示:
C:\JAVA_WORK>javac ReadXMLFile.java

C:\JAVA_WORK>java ReadXMLFile

輸入分類號:0299

年度號 : 0085
分類號 : 0299
案次號 : 001

年度號 : 0085
分類號 : 0299
案次號 : 002

年度號 : 0089
分類號 : 0299
案次號 : 001

C:\JAVA_WORK>


目前的錯誤訊息如下:
C:\JAVA_WORK>java ReadXMLFile
輸入分類號:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""

        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at ReadXMLFile.main(ReadXMLFile.java:20)

C:\JAVA_WORK>


我想設一個[try-catch]機制"找不到的情況",如下所示?
當我輸入一個不存在或沒有該屬於分類號就會印出"查無此分類號!請重新輸入..."。
C:\JAVA_WORK>javac ReadXMLFile.java

C:\JAVA_WORK>java ReadXMLFile

輸入分類號:0419

查無此分類號!請重新輸入...

C:\JAVA_WORK>

懇請指點一下<(_ _)>

程式碼如下:
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
 
public class SearchFile {
    public static void main(String[] args) throws IOException {
  
    SAXBuilder builder = new SAXBuilder();
    File xmlFile = new File("C:\\JAVA_WORK\\test1.xml");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("輸入分類號:"); 
    String s = br.readLine(); 
    int num = Integer.parseInt(s); 

    try {
	Document document = (Document) builder.build(xmlFile);
	Element rootNode = document.getRootElement();
	List list = rootNode.getChildren("ROW");

	for (int i = 0; i < list.size(); i++) 
	{
 	   Element node = (Element) list.get(i);
                   
                   if (node.getChildText("分類號").equals(""+s))
	   {
	      System.out.println("年度號 : " + node.getChildText("年度號"));
	      System.out.println("分類號 : " + node.getChildText("分類號"));
  	      System.out.println("案次號 : " + node.getChildText("案次號"));
	      Scanner input = new Scanner(System.in);		      
	      input.hasNextLine();
                   }              
                   
		}
		
             
	  } catch (IOException io) {
		System.out.println(io.getMessage());
	  } catch (JDOMException jdomex) {
		System.out.println(jdomex.getMessage());
	  }
	}
}

xml格式如下:
<?xml version = '1.0' encoding = 'Big5'?>
<!DOCTYPE ROWSET [
<!ELEMENT ROWSET (ROW)*>
<!ELEMENT ROW (年度號, 案名?, 分類號, 案次號 )>
<!ATTLIST ROW          num CDATA #REQUIRED>
<!ATTLIST 電子檔案名稱 num CDATA #REQUIRED>
<!ATTLIST 附件名稱     num CDATA #REQUIRED>
<!ATTLIST 附件媒體型式 num CDATA #REQUIRED>
<!ATTLIST 附件數量     num CDATA #REQUIRED>
<!ATTLIST 附件單位     num CDATA #REQUIRED>
<!ATTLIST 主題         num CDATA #REQUIRED>
<!ATTLIST 附註         num CDATA #REQUIRED>
<!ELEMENT 案名 (#PCDATA)>
<!ELEMENT 年度號 (#PCDATA)>
<!ELEMENT 分類號 (#PCDATA)>
<!ELEMENT 案次號 (#PCDATA)>
]>

<ROWSET>

 <ROW num="1">
  年度號 : 0072
  分類號 : 200
  案次號 : 001
 </ROW>
 <ROW num="2">
  年度號 : 0070
  分類號 : 200
  案次號 : 002
 </ROW>
 <ROW num="3">
  年度號 : 0076
  分類號 : 011
  案次號 : 004
 </ROW>
 <ROW num="4">
  年度號 : 0091
  分類號 : 011
  案次號 : 001
 </ROW>
 <ROW num="5">
  年度號 : 0086
  分類號 : 0102
  案次號 : 053
 </ROW>
 <ROW num="6">
  年度號 : 0081
  分類號 : 012
  案次號 : 023
 </ROW>
 <ROW num="7">
  年度號 : 0071
  分類號 : 112
  案次號 : 013
 </ROW>

</ROWSET>
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 706
Location: 台北
Offline
依我的了解,您應該是想要在輸入的內容是空白或是不存在時都顯示一個錯誤訊息來提醒使用者吧?

設計的想法是:
利用一個boolean變數found,初始值為false,然後比對輸入的字串s,如果不是null時程式會利用for迴圈拜訪每個XML文件樹的節點,如果內容等於我們讀取到的分類號時,才將found設為true,並輸出結果,並等待使用者按下Enter才顯示下一筆。
以下是參考範例ReadXMLFile.java:
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ReadXMLFile {
	public static void main(String[] args) throws IOException {

		SAXBuilder builder = new SAXBuilder();
		File xmlFile = new File("C:\\JAVA_WORK\\test1.xml");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("輸入分類號:"); 
		String s = br.readLine();
		boolean found = false;

		if (s != null) {
			try {
				Document document = (Document) builder.build(xmlFile);
				Element rootNode = document.getRootElement();
				List list = rootNode.getChildren("ROW");

				for (int i = 0; i < list.size(); i++) 
				{
					Element node = (Element) list.get(i);

					if (node.getChildText("分類號").equals(s))
					{
						System.out.println("年度號 : " + node.getChildText("年度號"));
						System.out.println("分類號 : " + node.getChildText("分類號"));
						System.out.println("案次號 : " + node.getChildText("案次號"));
						Scanner input = new Scanner(System.in);		      
						input.hasNextLine();
						found = true;;
					}
				}
			} catch (IOException io) {
				System.out.println(io.getMessage());
			} catch (JDOMException jdomex) {
				System.out.println(jdomex.getMessage());
			}
		}
		if (!found) {
			System.out.println("查無此分類號!請重新輸入...");
		}
	}
}

以下是參考用的輸入檔test1.xml:
<ROWSET>
  <ROW num="1">
    <年度號>0080</年度號>
    <分類號>010302</分類號>
    <案次號>002</案次號>
  </ROW>
  <ROW num="2">
    <年度號>0078</年度號>
    <分類號>011602</分類號>
    <案次號>002</案次號>
  </ROW>
  <ROW num="3">
    <年度號>0070</年度號>
    <分類號>019302</分類號>
    <案次號>011</案次號>
  </ROW>
  <ROW num="1225">
    <年度號>0099</年度號>
    <分類號>018719</分類號>
    <案次號>111</案次號>
  </ROW>
</ROWSET>

分享經驗 累積智慧
[WWW] [MSN]
 
Forum Index » 網頁程式設計 Web Development
Go to:   
Mobile view