- 在使用迭代器(Iterator)时
- 严格检查元素是否存在
- 原理:迭代器的
hasNext()
方法用于检查集合中是否还有下一个元素。在每次调用next()
方法获取元素之前,务必先调用hasNext()
进行检查。这样可以确保只在有元素可供获取时才调用next()
。 - 示例:
- 假设我们有一个
List<Integer>
,使用迭代器遍历它:import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorUsage { public static void main(String[] args) { List<Integer> integerList = new ArrayList<>(); integerList.add(1); integerList.add(2); integerList.add(3); Iterator<Integer> iterator = integerList.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
- 在上述代码中,
while
循环的条件是iterator.hasNext()
,这保证了在集合中的元素全部被遍历完后,不会再尝试调用next()
方法,从而避免了NoSuchElementException
异常。
- 假设我们有一个
- 原理:迭代器的
- 考虑使用增强型for循环(for - each)作为替代方案
- 原理:增强型for循环是一种语法糖,它在底层自动使用迭代器来遍历集合,但隐藏了迭代器的复杂操作,包括检查元素是否存在。编译器会自动将增强型for循环转换为使用迭代器的代码,并且会正确处理元素遍历结束的情况。
- 示例:
- 对于上述的
List<Integer>
,使用增强型for循环遍历:import java.util.ArrayList; import java.util.List; public class ForEachUsage { public static void main(String[] args) { List<Integer> integerList = new ArrayList<>(); integerList.add(1); integerList.add(2); integerList.add(3); for (Integer num : integerList) { System.out.println(num); } } }
- 这种方式更简洁,并且不会因为忘记检查元素是否存在而导致异常。不过,在某些需要更精细控制迭代过程(如在遍历过程中删除元素)的场景下,可能还是需要使用普通的迭代器。
- 对于上述的
- 严格检查元素是否存在
- 在使用Scanner读取输入时
- 明确输入的预期数量和边界
- 原理:如果预先知道需要从输入源(如控制台、文件等)读取的元素数量,那么在读取完预期数量的元素后,就应该停止读取操作,避免尝试读取不存在的元素。
- 示例:
- 从控制台读取两个整数:
import java.util.Scanner; public class ScannerInput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入两个整数:"); int num1 = scanner.nextInt(); int num2 = scanner.nextInt(); // 此时已经读取了两个整数,不进行额外的读取操作 scanner.close(); } }
- 从控制台读取两个整数:
- 检查是否还有下一个输入元素
- 原理:如果不确定需要读取的输入元素数量,可以使用
Scanner
的hasNext()
或相关的hasNextXXX()
(如hasNextInt()
、hasNextDouble()
等)方法来检查是否还有下一个符合期望类型的元素。只有当这些方法返回true
时,才调用相应的nextXXX()
方法来读取元素。 - 示例:
- 从控制台读取整数,直到输入非整数为止:
import java.util.Scanner; public class ScannerInputCheck { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入整数,输入非整数结束:"); while (scanner.hasNextInt()) { int num = scanner.nextInt(); System.out.println(num); } scanner.close(); } }
- 从控制台读取整数,直到输入非整数为止:
- 原理:如果不确定需要读取的输入元素数量,可以使用
- 明确输入的预期数量和边界
- 在使用Enumeration时(虽然在现代Java开发中较少使用)
- 类似迭代器的处理方式
- 原理:
Enumeration
和迭代器类似,也有hasMoreElements()
方法用于检查是否还有元素,在调用nextElement()
方法获取元素之前,应该先检查hasMoreElements()
的返回值。 - 示例:
- 假设有一个
Vector<String>
,使用Enumeration
来遍历它:import java.util.Enumeration; import java.util.Vector; public class EnumerationUsage { public static void main(String[] args) { Vector<String> vector = new Vector<>(); vector.add("element1"); vector.add("element2"); vector.add("element3"); Enumeration<String> enumeration = vector.elements(); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); } } }
- 假设有一个
- 原理:
- 类似迭代器的处理方式