【问题标题】:Java While loop only works when printing [closed]Java While循环仅在打印时有效[关闭]
【发布时间】:2013-07-15 19:32:28
【问题描述】:

我的程序中有一个 while 循环,它仅在某个条件为真时才执行操作,但在那之前它什么都不做。每次运行循环时,我都会在控制台中打印“运行”一词,但这不再是必需的。当我删除 system.out.println 循环立即关闭并停止工作。为什么会这样?

int INFINITE = 1;
try {
    S3Object object = s3.getObject(new GetObjectRequest("saucyMMO", "logins.txt"));
    while (INFINITE == 1) {
        System.out.println();
        if (tryToLogin == true) {
            INFINITE = 0;
            BufferedReader br = new BufferedReader(
                new  InputStreamReader(object.getObjectContent()));
            String lineValue = null;
            while((lineValue = br.readLine()) != null && loggedInAs == null) {
            String splitResult[] = lineValue.split(",");
                boolean retVal = splitResult[0].equals(ui.usernameLogin.getText());
                boolean retVal2 = splitResult[1].equals(ui.passwordLogin.getText());
                if (retVal == true && retVal2 == true) {
                    loggedInAs = splitResult[0];
            System.out.println("logged in as : " + loggedInAs);
                } else if (retVal && !retVal2){
                    System.out.println("User exists, but password is incorrect");
                } else {

                }
            }
        }
    }
 } catch (AmazonServiceException ase) {

 } catch (AmazonClientException ace) {

 } catch (IOException e) {
   e.printStackTrace();
 } 

我为 AmazonServiceException 和 AmazonClientException 添加了异常处理,但无论是否使用 system.out.println,我都没有收到任何错误。

【问题讨论】:

  • 你怎么知道它存在循环?
  • 您在 catch 块中吞下了异常。这是一个可怕的想法。
  • ...尤其是当您的程序没有按预期运行时。
  • 即使我使用与不打印相同的输入,它也不会更改字符串“loggedInAs”或打印出“logged in as : somthing”
  • 我的猜测是用户名不存在或者正在被默默吞下的异常之一正在触发。

标签: java loops


【解决方案1】:

你在你的 catch 块中吞下了异常。

这是一个非常非常的坏主意。

这样做的问题是它非常很难调试异常。

您目前正在演示这个确切的场景。

e.printStackTrace() 添加到您的其他捕获块中。

当你运行你的程序时,你会看到一个信息丰富的堆栈跟踪。

阅读堆栈跟踪将帮助您找出问题所在。

很明显,您正在抛出与 Amazon 相关的异常之一。

【讨论】:

  • 这应该是评论...
  • 我也是这么想的……而且我已经评论过了。我想我是想把它放在这里,以便详细说明如何解决问题或继续调试。
  • 其实很有道理。你的程序一直执行到那个时候,然后抛出一个异常(你正在悄悄地吞下)。
  • 一般来说,如果我捕捉到一个异常,但我认为它不会真正发生,所以我不会费心处理这个问题脸,我修好了。永远不要让 catch 块空着,即使你认为它永远不会出现
  • @user1952381 我见过如此纠结的程序,如果我没有看到它,我永远不会相信它,除非你已经 证明这不是问题