我为点和向量写了一个类。我想用它们来计算向量的点和范数。 这些是点和矢量类
public class Point {
public float x,y;
}
public class MyVector {
public Point start,end;
}
我为点计算编写了这些代码。
public float dot(MyVector v) throws Exception
{
if( (start.x != v.start.x) || (start.y != v.start.y))
throw new Exception("Vectors not begin in same Point");
}
我想用这个函数来计算向量的范数。
public float norm()
{
return dot(this);
}
我知道规范函数永远不会发生异常情况。所以我不会抛出 例外。我知道我可以像贝娄那样做:
public float norm()
{
try
{
return dot(this);
}
catch(Exception e)
{
}
}
但我认为这是多余的。有没有办法删除try和catch in norm函数?
答案 0 :(得分:4)
这个意图不能用java表达。函数点是否抛出异常。
你不能给它一个“提示”来指明在某些条件下永远不会抛出异常。
您可以使用该情况或切换为仅使用RuntimeException。
或者你可以将它重构为像这样的东西
public float dot(MyVector v) throws Exception
{
if( (start.x != v.start.x) || (start.y != v.start.y))
throw new Exception("Vectors not begin in same Point");
return unchecked_dot(MyVector v)
}
其中unchecked_dot执行实际操作但不检查参数,并且不声明抛出异常。
public float norm()
{
return uncheked_dot(this);
}
答案 1 :(得分:2)
java语言中没有办法。
处理此问题的最佳方法是发表评论和重新抛出。
例如,如果您使用的write
方法需要Appendable
但传递StringBuilder
,那么您可能希望掩盖Appendable.append
抛出的事实IOException
因为StringBuilder
实际上从未实现此目的。
try {
write(myStringBuilder);
} catch (IOException ex) {
// Should never happen since StringBuilders do
// not throw IOexceptions on append.
throw new AssertionError(ex);
}
请注意,如果关于委托函数抛出的能力是错误的(现在或将来),那么通过重新抛出AssertionError
,可以为代码维护者提供有关错误的更多信息。
如果您的项目一致地使用日志记录系统,那么如果记录和删除异常不会违反任何不变量,那么日志记录可能是一个很好的选择。
答案 2 :(得分:1)
如果你有理由相信dot(...)应该抛出异常,那么也应该是规范(...)。吃掉异常并不是一个好主意。但是,是的,如果你愿意,你必须写一个尝试捕获。唯一的另一个选择是你可以从dot(...)抛出RuntimeException,在这种情况下你不需要捕获。
答案 3 :(得分:1)
不要抛出普通的例外。
创建一个RuntimeException的子类,并且 - 为了更容易捕获上游 - 命名它,例如“DotUndefinedException”。
当您使用运行时异常执行此操作时,除非您明确要处理它,否则不必指定它。