0

当用户没有在输入语句中输入任何内容时,我遇到了错误。我想过使用 Try/Catch 块来代替抛出异常来将 boolAskRepeat 设置为 true,这应该跳到代码的末尾并重复循环。

这不起作用,我相信我遗漏了一些东西,但我不确定是什么......它仍然抛出异常说:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at ITSLab03.main(ITSLab03.java:34)

这行代码是什么:inputStatus = input.readLine().toLowerCase().charAt(0);

我在这里做错了什么?

while (boolAskStatus == true)
{
    System.out.print("Employment Status (F or P): ");

    try 
    { 
        inputStatus = input.readLine().toLowerCase().charAt(0); 

        if (inputStatus == "f".charAt(0))
        {
            boolAskStatus = false;

            String stringCheckSalary = null;
            boolean boolCheckSalary = true;
            while (boolCheckSalary == true)
            {
                // some code
            }

            outputData(inputName, inputStatus, calculateFullTimePay(inputSalary));
        }
        else if (inputStatus == "p".charAt(0))
        {
            // some code                

            outputData(inputName, inputStatus, calculatePartTimePay(inputRate, inputHours));
        }
        else boolAskStatus = true;

    } 
    catch (IOException e) { boolAskStatus = true; }
}
4

4 回答 4

2

您还需要捕获StringIndexOutOfBoundsException(如果您正确观察堆栈跟踪,这就是您遇到的异常)

  catch (StringIndexOutOfBoundsException e) {
            boolAskStatus = true;  
      }

(或) catchException捕获所有运行时异常

catch (Exception e) {
                boolAskStatus = true;  
          }
于 2012-09-21T20:58:20.540 回答
2

正常的 try catch 模式应该是这样的:

try
{
    // code that is vulnerable to crash
}
catch (Specific-Exception1 e1)
{
    // perform action pertaining to this exception
}    
catch (Specific-Exception2 e2)
{
    // perform action pertaining to this exception
}    
....
....
catch (Exception exp) // general exception, all exceptions will be caught
{
    // Handle general exceptions. Normally i would end the program or 
    // inform the user that something unexpected occurred.
}
于 2012-09-21T21:02:11.547 回答
2

通过使用.charAt(0),您假设字符串的长度 > 0。

您可以通过执行以下操作来简化这一过程:

String entry = input.readLine().toLowerCase();
if (entry.startsWith("f")) {
    ...
}
else if ("entry".startsWith("p")) {
    ...
}
于 2012-09-21T21:06:40.593 回答
2

您的代码无法按照您想要的方式工作,因为input.readLine().toLowerCase().charAt(0)抛出了 a StringIndexOutOfBoundsException,而不是 a IOException,因此 catch 块永远不会被命中。您可以通过将 catch 更改为

catch (StringIndexOutOfBoundsExceptione e) { boolAskStatus = true; }

但...

将程序的正常行为基于异常处理通常不是一个好主意。将异常抛出视为可能发生但通常不会发生的事情。为什么不使用类似的东西:

final String STATUS_F = "f";
final String STATUS_P = "p";

String fromUser = null;
do {
    String rawInput = input.readLine().toLowerCase();
    if (rawInput.startsWith(STATUS_F)) {
        fromUser = STATUS_F;
    } else if (rawInput.startsWith(STATUS_P)) {
        fromUser = STATUS_P;
    }
} while (fromUser == null);

if (STATUS_F.equals(fromUser)) {
    // do something
} else if (STATUS_P.equals(fromUser)) {
    // do something else
} else {
    // Shouldn't be able to get here!
    throw new Exception("WTF!?");
}

阅读本文的其他人更容易理解程序为什么循环以及如何控制循环,部分原因是确定用户输入内容的代码和决定如何处理该信息的代码是分开的。另外,您不需要处理异常。

于 2012-09-21T22:18:57.383 回答