c中的goto之类的异常是否在不需要时不使用它,或者可以按需使用它们,可以吗?为什么? 他们在CPU,内存或其他方面难吗?
答案 0 :(得分:1)
您应该将异常视为可以帮助您进行良好软件设计的工具,类似于数据封装(带有Getters / Setters的私有字段),继承,接口等。
Java中异常概念的思想是为您提供一种将错误处理转移到代码中最有意义的位置的好方法。当您在某行代码中遇到问题时,您首先要问自己:我应该在这里使用的这个方法/类负责处理问题,还是在我的那里有一个更好,更高级的位置应该处理的软件?如果您发现后者是这种情况,那么对那个更高级别的实例抛出异常是好的设计。
这样想:假设您工作地点的某人给您一包账单,并告诉您总计账单金额。然后在帐单中间找到另一个完全不同的文件。在这种情况下,去找给您一包文件并让他们处理的人更有意义,而不是自己决定要怎么做,因为您可能不知道确切要做什么。 >
软件示例:假设您有一种方法,该方法可以预期出生日期并计算出该人的年龄(与当前日期的差异)。但是随后您发现给定的日期不正确,例如因为它是将来的日期。此方法不应解决问题,因为您可能不知道如何做。该程序是控制台程序,您应该打印错误,还是将具有GUI?因此,您向知道是否有GUI的应用程序的更高级别抛出异常,从而知道是打印错误以在GUI中控制台还是显示对话框。那只是一个简单的例子,但是我希望你明白我的意思。
总结:在Java中,异常不是什么“坏”的东西。如果使用得当,它们是一件好事,可以帮助您避免将责任放到他们不应该拥有的对象中。
答案 1 :(得分:0)
...如果不需要,请不要使用它,或者可以按需使用它们吗?
根据 Joshua Bloch的有效Java :
顾名思义,异常仅用于特殊情况 条件;绝对不要将它们用于普通控制流。
为了完全理解这一点,让我们看一下Java异常。在Java中,我们可以找到三种类型的异常:检查的异常,运行时异常和 错误。
已检查的异常:顾名思义,开发人员应对其进行检查/处理。此外,编译器通过try...catch
强制您处理此异常,或者通过使用throws
关键字标记该方法来向上传播这些异常。这些异常通常会扩展内置的“ Exception”类。
未检查的异常:在此组中,输入运行时异常和错误。已检查的异常和未检查的异常之间的区别在于,编译器不会强制您处理未检查的异常。由于应该使用它们来指示编程错误,因此通常最好不要完全捕获它们并集中精力防止它们。 错误保留供JVM使用,以指示通常导致程序无法恢复的严重故障。所有未检查的
例外应该是RuntimeException
类的子类。
因此,要回答您的第一个问题,可以使用异常,只要它可使您的代码更具可读性和可读性即可。而且,您应该能够处理异常,因为编译器会强制您这样做。这并不意味着您随时都可以抛出异常。
现在让我们谈谈性能。再说一遍,在特殊情况下应使用例外。这意味着它们的性能不如单个if..else
那样。明智地使用它们,您不会真正注意到性能下降,过度使用它们可能会导致问题。绝对不要将异常用于控制流(可以使用goto
)。对于内存,每个异常都会创建一个新对象,该对象应包含有关异常本身的一些信息。创建许多异常将导致占用更多的内存,但是我认为这不会成为当今的问题。
如果我可以解决以下问题,我应该在Java中使用异常吗? 他们吗?
这取决于您,是决定还是支持他们。通常,抛出异常是为了通知缺少某些东西(例如:没有钱从信用卡中取款,不存在的文件无法打开等)。为了避免在这种情况下使用异常,最好返回在Optional
上。
此答案基于 Joshua Bloch 的有效Java 书。有关更多信息,我建议阅读例外一章。