我得到Exception时如何设置消息

时间:2012-10-16 04:40:29

标签: java android

public class XMLParser {

    // constructor
    public XMLParser() {

    }


    public String getXmlFromUrl(String url) {
        String responseBody = null;

        getset d1 = new getset();
        String d = d1.getData(); // text
        String y = d1.getYear(); // year
        String c = d1.getCircular();
        String p = d1.getPage();

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("YearID", y));

        nameValuePairs.add(new BasicNameValuePair("CircularNo", c));

        nameValuePairs.add(new BasicNameValuePair("SearchText", d));
        nameValuePairs.add(new BasicNameValuePair("pagenumber", p));
        try {

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);

            HttpEntity entity = response.getEntity();

            responseBody = EntityUtils.toString(entity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return responseBody;
    }


    public Document getDomElement(String xml) {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is);

        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());

            // i m getting Exception here

            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }

        return doc;
    }

    /**
     * Getting node value
     * 
     * @param elem
     *            element
     */
    public final String getElementValue(Node elem) {
        Node child;
        if (elem != null) {
            if (elem.hasChildNodes()) {
                for (child = elem.getFirstChild(); child != null; child = child
                        .getNextSibling()) {
                    if (child.getNodeType() == Node.TEXT_NODE) {
                        return child.getNodeValue();
                    }
                }
            }
        }
        return "";
    }

    /**
     * Getting node value
     * 
     * @param Element
     *            node
     * @param key
     *            string
     * */
    public String getValue(Element item, String str) {
        NodeList n = item.getElementsByTagName(str);
        return this.getElementValue(n.item(0));
    }
}

我在这个类中获取Exception来解析数据。我想在另一个从Activity扩展的类中打印此消息。你能告诉我怎么样吗?我尝试了很多但却无法做到..

public class AndroidXMLParsingActivity extends Activity {

    public int currentPage = 1;
    public ListView lisView1;
    static final String KEY_ITEM = "docdetails";
    static final String KEY_NAME = "heading";
    public Button btnNext;
    public Button btnPre;
    public static String url = "http://dev.taxmann.com/TaxmannService/TaxmannService.asmx/GetNotificationList";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // listView1
        lisView1 = (ListView) findViewById(R.id.listView1);

        // Next
        btnNext = (Button) findViewById(R.id.btnNext);
        // Perform action on click
        btnNext.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                currentPage = currentPage + 1;
                ShowData();
            }
        });

        // Previous
        btnPre = (Button) findViewById(R.id.btnPre);
        // Perform action on click
        btnPre.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                currentPage = currentPage - 1;
                ShowData();
            }
        });

        ShowData();
    }

    public void ShowData() {
        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(url); // getting XML

        Document doc = parser.getDomElement(xml); // getting DOM element

        NodeList nl = doc.getElementsByTagName(KEY_ITEM);

        int displayPerPage = 5; // Per Page
        int TotalRows = nl.getLength();
        int indexRowStart = ((displayPerPage * currentPage) - displayPerPage);
        int TotalPage = 0;
        if (TotalRows <= displayPerPage) {
            TotalPage = 1;
        } else if ((TotalRows % displayPerPage) == 0) {
            TotalPage = (TotalRows / displayPerPage);
        } else {
            TotalPage = (TotalRows / displayPerPage) + 1; // 7
            TotalPage = (int) TotalPage; // 7
        }
        int indexRowEnd = displayPerPage * currentPage; // 5
        if (indexRowEnd > TotalRows) {
            indexRowEnd = TotalRows;
        }

        // Disabled Button Next
        if (currentPage >= TotalPage) {
            btnNext.setEnabled(false);
        } else {
            btnNext.setEnabled(true);
        }

        // Disabled Button Previos
        if (currentPage <= 1) {
            btnPre.setEnabled(false);
        } else {
            btnPre.setEnabled(true);
        }

        // Load Data from Index
        int RowID = 1;
        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> map;

        // RowID
        if (currentPage > 1) {
            RowID = (displayPerPage * (currentPage - 1)) + 1;
        }

        for (int i = indexRowStart; i < indexRowEnd; i++) {
            Element e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            map = new HashMap<String, String>();
            map.put("RowID", String.valueOf(RowID));
            map.put(KEY_NAME, parser.getValue(e, KEY_NAME));

            // adding HashList to ArrayList
            menuItems.add(map);

            RowID = RowID + 1;

        }

        SimpleAdapter sAdap;
        sAdap = new SimpleAdapter(AndroidXMLParsingActivity.this, menuItems,
                R.layout.list_item, new String[] { "RowID", KEY_NAME },
                new int[] { R.id.ColRowID, R.id.ColName });
        lisView1.setAdapter(sAdap);
    }

}

这是我要打印该消息的课程

4 个答案:

答案 0 :(得分:2)

您可以使用Try/Catch块围绕代码,如下所示:

String xml;
Document doc;
NodeList nl;

try {

    xml = parser.getXmlFromUrl(url); // getting XML
    doc = parser.getDomElement(xml); // getting DOM element
    nl = doc.getElementsByTagName(KEY_ITEM);
} catch (Exception e) {
    Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}

这样您就不必在XMLParser类中进行任何更改,并且可以轻松处理在主类本身中解析代码时发生的任何异常。此外,为了显示错误消息,Toast是我认为最好的事情。

希望这有帮助..谢谢。

答案 1 :(得分:2)

我想说,在throws SAXException方法中添加XMLParser.getDomElement(),并且不会在此方法中捕获SAXException

  public Document getDomElement(String xml) throws SAXException {

抓住您SAXException方法AndroidXMLParsingActivity.ShowData()中的getDomElement()并按所需方式打印消息,例如

 public void ShowData() {
    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(url); // getting XML

    Document doc = null;
    try{
          doc  = parser.getDomElement(xml); // getting DOM element
      }catch(SAXException sae){
         //print the desired message here
      }

      .......
      .......
 }

答案 2 :(得分:1)

只需将构造函数传递给XMLParser类,并将其用作构造函数。或者,您可以尝试使用getApplicationContext()当您收到如下所示的异常时,您只需显示Toast即可 -

try {

    DocumentBuilder db = dbf.newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    doc = db.parse(is);

} catch (ParserConfigurationException e) {
    Log.e("Error: ", e.getMessage());
    Toast.makeToast(con, e.toString(), Toast.Long).show();   // Will show the message of exception
    return null;
} catch (SAXException e) {
    Log.e("Error: ", e.getMessage());
    Toast.makeToast(con, e.toString(), Toast.Long).show();   // Will show the message of exception
    // i m getting Exception here
    return null;
} catch (IOException e) {
    Log.e("Error: ", e.getMessage());
    Toast.makeToast(con, e.toString(), Toast.Long).show();   // Will show the message of exception
    return null;
}

<强>更新

好的,只需按照下面的说法传递构造函数 - 你在调用XMLparser类的地方就像下面那样调用 -

....
XMLParser xml = new XMLParser(AndroidXMLParsingActivity.this);
....

而且,在XMLParser课程中,请提及您的构造函数,如下所示 -

public class XMLParser {

    Context con;

    public XMLParser(Context context) {

        con = context;

    }
......
}

并且,在con类中使用此XMLParser作为构造函数。

答案 3 :(得分:1)

要显示来自非活动类的消息,您需要将当前活动上下文传递为:

public class XMLParser {

Context context
    // constructor
    public XMLParser(Context conts) {
    context =conts;
    }
///YOUR CODE
try {

    DocumentBuilder db = dbf.newDocumentBuilder();
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    doc = db.parse(is);

} catch (ParserConfigurationException e) {
    Log.e("Error: ", e.getMessage());
    Toast.makeToast(context, e.toString(), Toast.Long).show();   
    return null;
} catch (SAXException e) {
    Log.e("Error: ", e.getMessage());
    Toast.makeToast(context, e.toString(), Toast.Long).show();  
    // i m getting Exception here
    return null;
} catch (IOException e) {
    Log.e("Error: ", e.getMessage());
    Toast.makeToast(context, e.toString(), Toast.Long).show();  
    return null;
}