如果用户输入的用户字符串不是可接受的,那么编写一个异常类来抛出?

时间:2017-11-29 06:32:25

标签: java string exception-handling

编辑: 对不起我之前没有说清楚,我已经编写了这个程序并使用嵌套if完成它,我现在正在尝试做的是练习编写异常类,我明白这种方式效率低于方式我以前写过它,但我试图这样做以进一步了解java。再次感谢。

基本上你唯一可以键入的字符串是“print,sortfirst,sortlast,sortgrade”,如果没有winded if语句,我无法弄清楚如何编写它。

我写的课是;

public class WrongCommandException extends Exception
{
public WrongCommandException (String message)
{
    super(message);
}
}

我必须在这个类中构造参数,还是我会在while循环中的主类中读取用户输入?

4 个答案:

答案 0 :(得分:1)

您的方法存在的问题是,您提议添加一种在运行时使代码失败的新方法。当您尝试处理其他运行时故障时(即您首先抛出异常的原因),运行时失败是一个坏主意。

在编译时无法使用无效输入 。如果您只想接受有限数量的输入,请:

  • 为每个输入创建例外的特定子类;
  • 在异常类中提供静态工厂方法,每个方法构造一个特定输入的异常;
  • 为每个有效输入创建一个枚举,一个值,并将一个实例传递给构造函数。

答案 1 :(得分:0)

将您的业务绑定在异常中是个坏主意/设计。

检查您的业务所需的位置,如果用户输入了错误的内容,请使用此例外。

将条件放在while循环中,在那里检查用户。这样您就可以在整个项目中重复使用此异常。

进入嵌套if的部分,创建一个具有预定义值的数组,并使用简单的循环检查数组内输入的值。这样你可以减少if。

答案 2 :(得分:0)

通常,通过抛出异常来解决输入错误的问题不是一个好主意,因为它会在运行时停止程序的正常工作。有更好的方法,比如在while循环中请求另一个输入,或者只是在输入不正确时打印某种错误消息。

如果你认为在你的情况下这是最好的主意我建议将输入值分配给String s并用

进行检查
(if "print".equals(s) || "sortfirst".equals(s) || ...)) 
    { throw new WrongCommandException("Your message here") }

创建异常类时,最好创建一个带有String参数的构造函数,该参数将在抛出异常时显示。

但同样,在你的情况下更好的想法是在main()方法中在while循环中进行所有必需的检查,而不是抛出异常,也不在异常体中提供检查

答案 3 :(得分:0)

业务逻辑不会进入异常,但拥有非常明确的异常消息对于拥有可维护的系统至关重要。

public InvalidCommandException extends FormattedRuntimeException
{
    public InvalidCommandException(@Nonnull final String command)
    {
        super("(%s) is not a valid command. Valid command are [print, sortfirst, sortlast, sortgrade]!", command);
    }
}

以下是FormattedRuntimeException

/**
 * This is a convenience facade class to enable simple message creation as the String.format()
 * facilities instead of manually building strings to pass in as a message.
 * <p/>
 */
public class FormattedRuntimeException extends RuntimeException
{
    protected FormattedRuntimeException(@Nonnull final String format, @Nonnull Object... args)
    {
        super(String.format(format, args));
    }

    protected FormattedRuntimeException(@Nonnull final Throwable cause, @Nonnull String format, @Nonnull Object... args)
    {
        super(String.format(format, args), cause);
    }

    /**
     * This no-arg constructor is hidden specifically to keep people from using it
     */
    private FormattedRuntimeException()
    { /* keep people from using "anonymous" instances */ }

    /**
     * This Exception only constructor is hidden specifically to keep people from using it
     */
    private FormattedRuntimeException(final Exception e)
    { /* keep people from using "anonymous" instances */ }
}