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

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

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

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

我写的课是;

public class WrongCommandException extends Exception

{

public WrongCommandException (String message)

{

super(message);

}

}

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

你是如何阅读输入的?命令行参数?java.util.scanner?

您可以简单地使用Arrays.asList("print","sortfirst" etc).contains(message)来避免if。但我认为不管怎样,做你想做的是一个坏主意。

@Jarrodroberson我正在使用扫描仪,这是一个我已经提交并通过的旧项目,现在只是使用它来实践不同类型的异常处理。

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

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

为每个输入创建异常的特定子类;

在异常类中提供静态工厂方法,每个方法为特定的输入构造一个异常;

创建一个枚举,每个有效输入一个值,并将一个实例传递给构造函数。

是的,在这里使用一个枚举-这是一个完美的用例,正是我要建议的。不过,顺便说一句,我不清楚如果这些是受支持的命令,为什么会出现异常…

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

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.

*

*/

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,并检查

(if"print".equals(s) ||"sortfirst".equals(s) || ...))

{ throw new WrongCommandException("Your message here") }

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

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

我写的程序已经完成了,这就是我最初用循环和嵌套的ifs编写它的方法,以获得可接受的命令,但是现在我正在处理异常,我应该清楚地表明,我知道它的效率要低得多,但更多的是一个学习程序而不是有效的谢谢,当我回到我的计算机上时,我会仔细考虑这个问题。

@Gonephisin我认为编辑你的问题以包含你在评论中给出的其他信息是一个好主意,以便让阅读它的人更好地理解你的问题。祝你一切顺利。

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值