1

我在一个 Java 项目中有一个类,它包含一个二维值数组,并提供了与之交互的有用方法。它使用 Location 对象(仅存储两个值)来访问映射中的点并返回值。它有一个方法 isValid(),用于检查 Location 对象是否在网格的映射中。

public boolean isValid(Location loc) {
    try {
        // will throw an ArrayIndexOutOfBoundsException if not valid
        // occs is the 2D array within the class
        occs[loc.getX()][loc.getY()];
        return true;
    }
    catch (ArrayIndexOutOfBoundsException e) {
        return false;
    }
}

现在,我知道我可以使用比较来检查值并查看该 loc 是否适合网格,但这更快,因为它不需要运行比较,并且检查的无效位置的情况远在少数。但是,这是我的问题:由于访问数组的行返回的值没有被分配或发送到方法中,因此我收到有关 AssignmentOperators 的错误。我知道将它分配给一个临时值或通过一些无用的方法运行它是一个简单的解决方法,但这两种方法对我来说似乎都是愚蠢的创可贴解决方案,我想知道是否有更清洁的方法来做到这一点。(此外,前者会引起 Eclipse 的警告。)

无论如何,这是低优先级,但让我很烦恼的是,这么简单的事情在如此简单的实现中是不可能的,老实说。谢谢!

4

2 回答 2

2

这更快,因为它不需要运行比较。

当然,它需要“运行比较”。它还能怎么工作?你在这一点上的推理是错误的。因此,您的问题是无效的。

于 2013-09-18T11:51:39.727 回答
1

不幸的是,这正是 Java 的方式。从 JLS 第 14.8 节,表达式语句:

与 C 和 C++ 不同,Java 编程语言只允许将某些形式的表达式用作表达式语句。请注意,Java 编程语言不允许“强制转换为 void”——void 不是一种类型——因此编写表达式语句的传统 C 技巧,例如:

(空白)... ; // 不正确!不起作用。另一方面,Java 编程语言允许在表达式语句中使用所有最有用的表达式,并且不需要将方法调用用作表达式语句来调用 void 方法,因此几乎不需要这样的技巧。如果需要技巧,可以使用赋值语句(第 15.26 节)或局部变量声明语句(第 14.4 节)来代替。

目前尚不清楚他们这样做的确切原因,但我的猜测是它旨在减少错误。例如,如果有人不小心写a == b;而不是a=b;,将导致编译器错误。在极少数情况下,有人真正想要这种行为,他们必须将其显式分配给临时变量(或将其传递给方法或类似方法)。

于 2013-05-03T18:24:00.210 回答