关于java:编写一个异常类,如果用户输入的用户字符串不是可接受的,则抛出异常类?

Writing an exception class to throw if user string input by user is not an accepted one?

本问题已经有最佳答案,请猛点这里访问。

编辑:对不起,我之前没有明确说明,我已经用嵌套的IF写了这个程序并完成了它,我现在想做的是练习编写异常类,我知道这种方式比我以前写的方式效率低,但是我试着这样做来进一步了解更多关于Java的知识。再次感谢。

基本上,只允许键入"print、sortFirst、sortLast、sortGrade"字符串,如果没有一个循环的if语句,我就不知道如何编写这个字符串。

我写的课是;

1
2
3
4
5
6
7
public class WrongCommandException extends Exception
{
public WrongCommandException (String message)
{
    super(message);
}
}

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


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

使编译时不可能使用无效的输入。如果您只想接受有限数量的输入,请执行以下任一操作:

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


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

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * 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 */ }
}


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

如果您仍然认为这是您的最佳想法,我建议将输入值分配给String s,并检查

1
2
(if"print".equals(s) ||"sortfirst".equals(s) || ...))
    { throw new WrongCommandException("Your message here") }

创建异常类时,最好创建一个采用字符串参数的构造函数,该参数将在引发异常时显示。

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


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

在需要的地方检查您的业务,如果用户输入了错误的内容,就使用这个异常。

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

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