Java - 在' catch'中包含负值。用于Double.parseDouble()的块

时间:2016-03-04 21:45:49

标签: java try-catch negative-number

我有一个可以向服务器发送消息的Java客户端应用程序。我正在设置输入验证,以便客户端检测是否已在'发送'上发送了可接受的消息。按钮点击。

应该接受的消息是可以解析为double或多个选定字符串的任何消息(由string.equals()方法识别)。

我首先测试字符串,如果不满足条件,我会尝试将消息解析为double(Double.parseDouble(message))。此时,我有一个try/catch块,可以识别任何失败的解析要解析为double(意味着它必须包含字母,因此无效),它会捕获NumberFormatException并允许用户有机会重新获得 - 输入信息。

我现在想要这样做,以便数字不能为负数,并且希望将其包含在同一个try/catch块中,以便任何负值都可以为用户提供重新输入的相同机会。

以下是我目前的情况:

    else
    {   
        try
        {
            //convert number to double (monetary value)
            bidAmount = Double.parseDouble(messageToServer);
            //send to server with item code
            output.println(selectedItemCode + bidAmount);
        }
        //item cannot turned to double
        catch (NumberFormatException numfEx)
        {
            //inform user
            fromServer.setText("Invalid Request!"
                    + USER_PROMPT);
        }
    }
    //clear input field for subsequent entry
    toServer.setText("");

有人能指出我如何实施这条规则的方向,如果可能的话,没有代码重复吗?

谢谢, 标记

3 个答案:

答案 0 :(得分:4)

bidAmount = Double.parseDouble(messageToServer);之后,我们需要添加以下内容:

if(bidAmount < 0){
  throw new NumberFormatException("Invalid amount");
}

备用解决方案(可能还有最佳实践)是修改catch块以捕获IllegalArgumentException并在数量小于0时抛出IllegalArgumentException,如下所示:

try
        {
            //convert number to double (monetary value)
            bidAmount = Double.parseDouble(messageToServer);
            if(bidAmount < 0){
                throw new IllegalArgumentException("Invalid amount");
            }
            //send to server with item code
            output.println(selectedItemCode + bidAmount);
        }
        //item cannot turned to double
        catch (IllegalArgumentException numfEx)
        {
            //inform user
            fromServer.setText("Invalid Request!"
                    + USER_PROMPT);
        }

答案 1 :(得分:1)

创建一个单独的方法,将String解析为Double,然后检查它是否为非负数,在无效情况下返回null。

//convert number to double (monetary value)
bidAmount = getDouble();
if(bidAmount != null) {

    //send to server with item code
    output.println(selectedItemCode + bidAmount);
    toServer.setText("");

} else {
    //item cannot turned to double
    //inform user
    fromServer.setText("Invalid Request!"
            + USER_PROMPT);
}



private Double getDouble() {
    try {
        double d = Double.parseDouble(messageToServer);
        if(d >= 0) {
            return d;
        }
    } catch (NumberFormatException numfEx) {}
    return null;
}

编辑:如果您反对使用空值,您还可以更改方法以返回默认负值,例如-1,然后更改条件以检查double是否为负而不是null。

答案 2 :(得分:1)

这可以在不依赖异常来控制程序流程的情况下实现,这通常是一个坏主意 - 请参阅讨论here

else {   
    // using a tempBidAmount as I don't have enough context to know whether
    // I could just assign the output of parseUserDouble directly to bidAmount
    // without causing issues
    Double tempBidAmount = parseUserDouble(messageToServer);

    if (tempBidAmount != null && tempBidAmount > 0.0) {
        bidAmount = tempBidAmount;
        output.println(selectedItemCode + bidAmount);
    } else {
        fromServer.setText("Invalid Request!" + USER_PROMPT);
    }
}
toServer.setText("");

....

private Double parseUserDouble(Sting userInput) {
    try {
        return Double.parseDouble(userInput);
    }
    catch (NumberFormatException numfEx) {
        // consider logging here        
    }
    return null;
}