【问题标题】:How to improve code performance without using more number of try catch in javajava - 如何在不使用更多数量的try catch的情况下提高代码性能
【发布时间】:2014-12-04 04:41:53
【问题描述】:

我有以下代码,用于读取来自第三方的消息如果我对我得到的每个值使用 try catch 而不丢失任何值(Null 值),则中间的一些值并停止打印它们。我的问题是,除了对每一行都使用 try catch 之外,还有其他选择吗?

try{
            printmsg.setGatepass(tosPrint.get("gatepass").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setTransactionType(tosPrint.get("transactionType").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setContainer(tosPrint.get("container").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setSsco(tosPrint.get("ssco").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setWgt(tosPrint.get("wgt").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setTruckingcmpny(tosPrint.get("truckingCompany").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setIssuetime(tosPrint.get("issueTime").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setLicense(tosPrint.get("driverLicense").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            printmsg.setChasis(tosPrint.get("chasis").toString());
            } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }try{
            descNodes = tosPrint.getJSONObject("description");
            linelist = descNodes.getJSONArray("eachLine");
            printmsg.setDescription_lines(new String[linelist.length()]);
            for (int i=0;i<linelist.length(); i++)
            {
                printmsg.getDescription_lines()[i]=  linelist.getString(i);
            }
        } catch (JSONException e) {
            e.printStackTrace();
            LogWriter.LogErrorMessage(e);
        }

假设如果我有 gatepass、transactionType、container、ssco、driverLicense、chasis 的值并且缺少一些值,例如 wgt、issueTime、truckingCompany,如果不使用 try catch 和使用 try catch,我可以打印到 ssco我能够打印所有值,所以如果没有任何值(即 null),是否有任何选项不使用 try catch 块的数量如何实现打印所有值。

【问题讨论】:

  • 使用像 GSON 这样的库。并且不要使用像上面这样的反模式;它让我的眼睛流血,而且会非常缓慢。
  • 异常处理是针对异常的,不是针对正常的控制流的。
  • 将此提交给codereview.stackexchange.com。不过请注意,那里的人不会善待重复的逻辑和异常滥用。
  • 如何在java中使用GSON将xml转换为json

标签: java xml json performance try-catch


【解决方案1】:

我认为您可以对所有逻辑使用一个 try-catch 块。如果其中一个步骤出现异常 - 将不会执行下一步:

    try{
        printmsg.setGatepass(tosPrint.get("gatepass").toString());
        printmsg.setTransactionType(tosPrint.get("transactionType").toString());
        printmsg.setContainer(tosPrint.get("container").toString());
        printmsg.setSsco(tosPrint.get("ssco").toString());
        printmsg.setWgt(tosPrint.get("wgt").toString());
        printmsg.setTruckingcmpny(tosPrint.get("truckingCompany").toString());
        printmsg.setIssuetime(tosPrint.get("issueTime").toString());
        printmsg.setLicense(tosPrint.get("driverLicense").toString());
        printmsg.setChasis(tosPrint.get("chasis").toString());
        descNodes = tosPrint.getJSONObject("description");
        linelist = descNodes.getJSONArray("eachLine");
        printmsg.setDescription_lines(new String[linelist.length()]);
        for (int i=0;i<linelist.length(); i++)
        {
            printmsg.getDescription_lines()[i]=  linelist.getString(i);
        }
    } catch (JSONException e) {
        e.printStackTrace();
        LogWriter.LogErrorMessage(e);
    }

【讨论】:

  • 你提到的上面的代码我已经尝试过假设如果我有第一个和最后一个值中间值为 null 那么它正在捕获异常并且我无法打印最后一个值所以有没有其他方法继续
  • 公共类 JsonTestDemo { 公共静态 JSONObject jsonObject=null; private static JSONObject getJSONObject(String str){ try{ System.out.println("inside of try");返回 jsonObject.getJSONObject(str); } catch (JSONException e) { e.printStackTrace(); } System.out.println("低于捕获");返回 json 对象; } 私有静态字符串 getString(JSONObject lic,String str){ JSONObject innerObject=lic;尝试{返回innerObject.getString(str).toString(); } catch (JSONException e) { e.printStackTrace();}return innerObject.toString();}
【解决方案2】:

您是否尝试过 xstream 自定义、编写转换器。 ?

【讨论】:

  • 抱歉不知道
【解决方案3】:

我建议的最简单方法是覆盖/修改“tosPrint”的 .get() 方法。您必须在此方法中自行处理异常。如果您喜欢这种方法,请在您上面分享的内容后面和之后显示更多代码。 请参阅下面的代码示例以获取帮助:

创建一个类变量 tosPrint。 在您的类中创建一个私有 get 方法。 您必须按照下面给出的代码以这种方式进行试用。我的机器上现在没有安装 JVM。请配合编译错误。

public class PrintingMsgs{

    private TosPrint tosPrint;

      /*Here you wrap the get() method of third party jar */
    private String get(String str){
                   try{
                          return tosPrint.get(str).toString();
                   } catch (JSONException e) {
                          e.printStackTrace();
                          LogWriter.LogErrorMessage(e);
                   }
                   return null;
      }


    mainMethod(){
        tosPrint = new TosPrint();
        Printmsg printmsg= new Printmsg();

        printmsg.setGatepass(get("gatepass"));
        printmsg.setTransactionType(get("transactionType"));
        printmsg.setContainer(get("container"));
        printmsg.setSsco(get("ssco"));
        printmsg.setWgt(get("wgt"));
        printmsg.setTruckingcmpny(get("truckingCompany"));
        printmsg.setIssuetime(get("issueTime"));
        printmsg.setLicense(get("driverLicense"));
        printmsg.setChasis(get("chasis"));

        try{
                    descNodes = tosPrint.getJSONObject("description");
                    linelist = descNodes.getJSONArray("eachLine");
                        printmsg.setDescription_lines(new String[linelist.length()]);
                        for (int i=0;i<linelist.length(); i++)
                        {
                         printmsg.getDescription_lines()[i]=  linelist.getString(i);
                        }
                } catch (JSONException e) {
                    e.printStackTrace();
                        LogWriter.LogErrorMessage(e);
             }
    }
}

【讨论】:

  • 这里我使用第三方 jar 文件 java-json.jar 将此 xml 转换为 json,因此我无权修改我只是使用它们的超类。
  • 没关系。编写一个包装类,就像我在上面的示例代码中写的那样。你还在为用java写上面的逻辑而困惑吗?如果是这样,请分享完整的课程文件。
  • 这里的 tosPrint 是一个 POJO 类
  • 我已经添加了java文件的完整实现。希望这对您来说很容易理解。
  • 公共类 PrintJobMsgStructure { String bkbl = "";字符串 bkcnt = "";公共 JSONObject jsonObject=null;私有字符串 getString(String str){ try{ return jsonObject.getString(str).toString(); } catch (JSONException e) { e.printStackTrace(); } 返回空值; } public PrintJobMsgStructure() { } public String getBkbl() { return bkbl; } public void setBkbl(String bkbl) { this.bkbl = bkbl; } 公共字符串 getBkcnt() { 返回 bkcnt; } public void setBkcnt(String bkcnt) { this.bkcnt = bkcnt; }}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多