2011-11-04 44 views
0

我正在为点和向量写一个类。我想用它们来计算向量的点和范数。 这些是点和矢量类在java中从不发生的异常

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?

+4

抛出一些扩展了RuntimeException的东西 - 您不需要尝试/捕获未经检查的异常。 (请参阅http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html) – BobG

回答

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); 
} 
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重新抛出的能力,你给代码维护者有关什么地方出了错更多信息。

如果您的项目始终如一地使用日志记录系统,那么如果记录和删除异常不会违反任何不变量,则日志记录可以是一个不错的选项。

1

如果你有理由相信点(...)应该抛出异常,也可能是规范(...)。吃掉异常并不是一个好主意。但是,是的,如果你确实想要,你必须写一个尝试。唯一的另一种选择是你可以从点(...)抛出RuntimeException,在这种情况下你不需要捕获。

+0

不是,在这种情况下,dot()会抛出类似非法参数异常的内容。然而,norm()并不是这样,它没有任何参数。 – Krab

+0

@Krab,这是一个非常有效的点! – aishwarya

1

不要抛出一个普通的例外。

创建RuntimeException的一个子类并使其更容易捕获上游 - 将其命名为“DotUndefinedException”。

当您使用运行时异常来执行此操作时,您不必指定它,除非您明确要处理它。