Java调试(debug)是开发过程中非常重要的一环,它帮助我们找到并修复代码中的错误。以下是一些经典的Java调试案例:
空指针异常(NullPointerException):
null
时,会抛出空指针异常。null
的对象引用,确保在使用前进行非空检查。public class Example {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // 这里会抛出NullPointerException
}
}
数组越界异常(ArrayIndexOutOfBoundsException):
public class Example {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[3]); // 这里会抛出ArrayIndexOutOfBoundsException
}
}
类型转换异常(ClassCastException):
public class Example {
public static void main(String[] args) {
Object obj = "Hello";
String str = (String) obj; // 这里会抛出ClassCastException
}
}
数组初始化异常(NegativeArraySizeException):
public class Example {
public static void main(String[] args) {
int[] arr = new int[-5]; // 这里会抛出NegativeArraySizeException
}
}
逻辑错误:
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 2) {
arr[i] = 42; // 这里可能是逻辑错误
}
}
System.out.println(arr[1]); // 预期输出2,实际输出42
}
}
并发问题:
synchronized
关键字、Lock
接口)来确保线程安全。public class Example {
private static int counter = 0;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter++;
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter--;
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(counter); // 预期输出0,实际输出可能不是0
}
}
通过这些经典案例,你可以更好地理解和掌握Java调试的技巧和方法。