首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java正在遍历整个代码3次

Java正在遍历整个代码3次
EN

Stack Overflow用户
提问于 2015-10-30 17:42:36
回答 1查看 145关注 0票数 0

我编写了一些代码,在PDF文件的所有页面上加上从PHP作为参数传递的电子邮件和IP。我有几个问题。请看下面的内容。

代码:

Main.java

代码语言:javascript
复制
public class Main {

public static void main(String[] args) throws IOException {
    Logger log = LoggerFactory.getLogger("User ID: " + args[0]);

    try {
        Helper.sortposition(args[0], args[1], args[2], args[3], args[4], args[5]);
    } catch (ArrayIndexOutOfBoundsException e) {
        String code = "PARAMETER MISSING FROM PHP";
        log.error(code);
    }
}
}

Helper.java

代码语言:javascript
复制
public class Helper {

public static void sortposition(String id, String email, String ip, String originalpdf, String newpdf, String report) throws IOException {

    Properties prop = new Properties();
    InputStream in = null;
    String hxStr, hyStr, fxStr, fyStr, fhStr, ffStr;
    Float hx, hy, fx, fy, fh, ff;
        /*  hx= Header "x" position
            hy= Header "y" position
            fx= Footer "x" position
            fy= Footer "y" position
            fh= Font size on the Header (Font Header)
            ff= Font size on the Footer (Font Footer) */

    String colour;

    in = Helper.class.getResourceAsStream("files/config.properties");
    prop.load(in);

    switch (report) {
        case "1":
            fhStr = prop.getProperty("fh1");
            ffStr = prop.getProperty("ff1");
            colour = prop.getProperty("type1rgb");
            hxStr = prop.getProperty("type1hx");
            hyStr = prop.getProperty("type1hy");
            fxStr = prop.getProperty("type1fx");
            fyStr = prop.getProperty("type1fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        case "2":
            fhStr = prop.getProperty("fh2");
            ffStr = prop.getProperty("ff2");
            colour = prop.getProperty("type2rgb");
            hxStr = prop.getProperty("type2hx");
            hyStr = prop.getProperty("type2hy");
            fxStr = prop.getProperty("type2fx");
            fyStr = prop.getProperty("type2fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        case "3":
            fhStr = prop.getProperty("fh3");
            ffStr = prop.getProperty("ff3");
            colour = prop.getProperty("type3rgb");
            hxStr = prop.getProperty("type3hx");
            hyStr = prop.getProperty("type3hy");
            fxStr = prop.getProperty("type3fx");
            fyStr = prop.getProperty("type3fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        case "4":
            fhStr = prop.getProperty("fh4");
            ffStr = prop.getProperty("ff4");
            colour = prop.getProperty("type4rgb");
            hxStr = prop.getProperty("type4hx");
            hyStr = prop.getProperty("type4hy");
            fxStr = prop.getProperty("type4fx");
            fyStr = prop.getProperty("type4fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        default:
            fhStr = prop.getProperty("fh5");
            ffStr = prop.getProperty("ff5");
            colour = prop.getProperty("type5rgb");
            hxStr = prop.getProperty("type5hx");
            hyStr = prop.getProperty("type5hy");
            fxStr = prop.getProperty("type5fx");
            fyStr = prop.getProperty("type5fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
    }

    String delims = "[,]+";
    String[] colourstr = colour.split(delims);
    int[] rgb = new int[colourstr.length];
    for (int i = 0; i < colourstr.length; ) {
        rgb[i] = Integer.parseInt(colourstr[i]);
        i++;
        Stamper.putStamp(id, email, ip, originalpdf, newpdf, rgb, hx, hy, fx, fy, fh, ff);
    }
}
}

Stamper.java

代码语言:javascript
复制
public class Stamper {

public static void putStamp(String id, String email, String ip, String originalpdf, String newpdf, int[] rgb, Float hx, Float hy, Float fx, Float fy, Float fh, Float ff) {
    Logger log = LoggerFactory.getLogger("User ID: " + id);

    PdfReader pdfReader;
    PdfStamper pdfStamper = null;
    Properties prop = new Properties();
    InputStream in = null;

    try {
        in = Stamper.class.getResourceAsStream("files/config.properties");
        prop.load(in);

        pdfReader = new PdfReader(originalpdf);
        pdfStamper = new PdfStamper(pdfReader,
                new FileOutputStream(newpdf));

        Font font = FontFactory.getFont("files/LTe50327.ttf",
                BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 0.8f, Font.BOLD);
        BaseFont bf = font.getBaseFont();

        int pages = pdfReader.getNumberOfPages();
        for (int i = 1; i <= pages; i++) {
            PdfContentByte pageContentByteHeader = pdfStamper.getOverContent(i);
            PdfContentByte pageContentByteFooter = pdfStamper.getOverContent(i);
            pageContentByteHeader.beginText();
            pageContentByteHeader.setFontAndSize(bf, fh);
            pageContentByteHeader.setRGBColorFill(rgb[0], rgb[1], rgb[2]);
            pageContentByteHeader.setTextMatrix(hx, hy);
            pageContentByteHeader.showText("This report has been prepared for " + email
                    + " " + ip + " Not to be redistributed without prior permission.");
            pageContentByteHeader.endText();

            pageContentByteFooter.beginText();
            pageContentByteFooter.setFontAndSize(bf, ff);
            pageContentByteFooter.setRGBColorFill(rgb[0], rgb[1], rgb[2]);
            pageContentByteFooter.setTextMatrix(fx, fy);
            pageContentByteFooter.showText("This report has been prepared for " + email
                    + " " + ip + " Not to be redistributed without prior permission.");
            pageContentByteFooter.endText();
        }

    } catch (IOException | DocumentException e) {
        String code = "Problem with opening or saving PDF file";
        log.error(code);
    } finally {
        try {
            if (pdfStamper != null) {
                pdfStamper.close();
            }
            if (in != null) {
                in.close();
            }
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }
}
}

它按预期工作,但它似乎正在循环整个代码3次。

在调试它时,我注意到它第一次正常运行(主-> Helper ->邮票),但是当它完成后,它会返回到Helper类,然后再继续到->。然后在完成之前再做一次。我确信我忽略了一些简单的东西,但由于我仍然是Java方面的初学者,我无法理解为什么会发生这种情况。这很烦人,因为当它捕获异常时,它会记录3次。

当我故意让它抛出一个异常来测试记录器时,它会输出以下内容:

代码语言:javascript
复制
17:22:12.541 [main] ERROR User ID: 10548 - Problem with opening or saving PDF file
17:22:12.596 [main] ERROR User ID: 10548 - Problem with opening or saving PDF file
17:22:12.635 [main] ERROR User ID: 10548 - Problem with opening or saving PDF file

Process finished with exit code 0

所以我的问题是:

1̶-̶̶w h̶y̶̶i̶s̶̶m̶y̶̶c̶o̶o̶d̶e̶̶l̶o̶p̶i̶n̶g̶3

在Helper类中,是否有一种使用if语句而不是开关的方法?它会有什么好处吗?我试过了,但一直没成功。

3-在邮票类中,是否有一种方法可以捕获IOException,使我知道问题是在打开PDF (原件PDF)还是保存(newpdf)并相应地登录时?而不是现在的方式,日志记录:“打开或保存PDF文件的问题”。

如有任何意见,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 17:46:35

代码语言:javascript
复制
for (int i = 0; i < colourstr.length; )

Helper类中,这个循环将多次抛出异常。与colours.str.length一样多次,因为它调用

代码语言:javascript
复制
Stamper.putStamp(id, email, ip, originalpdf, newpdf, rgb, hx, hy, fx, fy, fh, ff);

每次它都会循环。

解决方案的一个途径就是准确地检测这个循环正在做什么。一旦你这样做了,问问自己是否需要调用三次相同的方法。如果仍然是这样的话,这里没有问题。如果不是,那就由你来做正确的改变。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33441910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档