编辑: 对不起我之前没有说清楚,我已经编写了这个程序并使用嵌套if完成它,我现在正在尝试做的是练习编写异常类,我明白这种方式效率低于方式我以前写过它,但我试图这样做以进一步了解java。再次感谢。
基本上你唯一可以键入的字符串是“print,sortfirst,sortlast,sortgrade”,如果没有winded if语句,我无法弄清楚如何编写它。
我写的课是;public class WrongCommandException extends Exception
{
public WrongCommandException (String message)
{
super(message);
}
}
我必须在这个类中构造参数,还是我会在while循环中的主类中读取用户输入?
答案 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 */ }
}