如何在Java中计算带有逻辑运算符的表达式?
我一直在尝试用Java实现插入排序,但在我的程序中遇到了一个奇怪的错误。执行插入的如何在Java中计算带有逻辑运算符的表达式?,java,Java,我一直在尝试用Java实现插入排序,但在我的程序中遇到了一个奇怪的错误。执行插入的while循环具有以下条件: while (arr[j] > key && j>=0) 当j键&&j>=0时,循环因ArrayIndexOutOfBoundsException而崩溃{ arr[j+1]=arr[j]; j=j-1; } arr[j+1]=键; } 返回arr; } } 公共类InsertionSort{ 公共静态void main(字符串[]args){ System
while
循环具有以下条件:
while (arr[j] > key && j>=0)
当j键&&j>=0时,循环因ArrayIndexOutOfBoundsException
而崩溃{
arr[j+1]=arr[j];
j=j-1;
}
arr[j+1]=键;
}
返回arr;
}
}
公共类InsertionSort{
公共静态void main(字符串[]args){
System.out.println(“就是它”);
int[]测试={54,68,92,3565,8,7,64,0};
排序lort=新排序();
lort.分类(测试);
for(int a:测试)
系统输出打印项次(a);
}
}
在尝试访问数组索引之前,检查数组索引是否有效非常重要。Java先计算&&
的左侧,再计算右侧。如果先检查arr[j]>键
,则不知道j
是否为有效索引,因为这是j>=0
检查的内容
当您交换顺序并写入j>=0&&array[j]>键
时,如果j
为非负,则它将仅访问array[j]
。如果为负,则循环立即停止。永远不会访问无效索引,从而避免了异常
进一步阅读:
- 当
点击-1时,这:j
计算第一部分,并while(arr[j]>键和&j>=0)
抛出arr[-1]
ArrayIndexOutOfBoundsException
- 当
点击-1时,这:j
永远不要尝试访问而(j>=0&&…
,因为这是一个arr[-1]
和
运算符,第一个条件为false就足以结束计算。第二个条件不相关,因此不会在运行时执行。这样可以避免试图从Java数组的
位置读取数据 有些人说这是手术被诅咒了,莱纳斯Turvald会在你的余生中显示你的C++有多么坏。[-1]
- 布尔运算符(
&&
和|
)是“短路”。这意味着:一旦答案明确无误,他们就会立即放弃他们正在做的事情
特别是,这意味着somethingtheatevalstofalse&&foo
导致foo
甚至没有被评估-false&&anything
是false,因此,没有意义。这同样适用于something theatevalstorue | | foo
-true | |任何东西
都必须是真的,因此,foo
无需评估以提供答案
如果foo
有副作用,这是相关的array[j]>key
的副作用是,如果j
为负数或超过数组大小,它将抛出AIOBEx。如果发生短路,则不计算整个表达式
Java语言规范涵盖了这一点,但我不建议通过阅读语言规范来学习Java。这应该是教程中的一章。你的意思是说第一个版本由于
ArrayIndexOutOfBoundsException而崩溃,而第二个版本没有?这是有道理的。@JohnKugelman是的,你是对的。
while (j >= 0 && arr[j] > key)
//Insertion Sort
class Sort {
public int[] sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i - 1;
int key = arr[i];
while (arr[j] > key && j>=0) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
return arr;
}
}
public class InsertionSort {
public static void main(String[] args) {
System.out.println("THis is it");
int[] test = { 54, 68, 92, 3, 565, 8, 7, 64, 0 };
Sort lort = new Sort();
lort.sort(test);
for (int a : test)
System.out.println(a);
}
}