课前任务列表
- 1.说出两个我们在使用软件、APP时遇到的错误。这些错误可能是什么类型的错误?你是怎么解决这类错误呢(重启、查看日志...)?
- 2.说出两个你在编写Java程序时最常遇到的错误。并判定这些错误是什么类型的错误(编译错误、运行时错误)。你认为哪种类型的错误更好解决呢?
- 3.查询JDK文档,说说如下代码哪行抛出了什么类型的异常?为什么该段程序明明可能产生错误,但是不写try...catch,也可编译通过。为上述代码添加try...catch。使得当输入错误时,可提示重新输入,直到输入正确后,才能继续往下执行。
- 4. 将如下代码中NumberFormatException改成Exception可以吗?
- 5.查询JDK文档,说说如下代码哪里抛出了什么异常?该异常意味着吗什么?需要捕获吗?为什么?
1.说出两个我们在使用软件、APP时遇到的错误。这些错误可能是什么类型的错误?你是怎么解决这类错误呢(重启、查看日志…)?
①无响应问题:
错误类型:
软件自身问题:软件可能存在程序漏洞、代码逻辑错误或资源管理不善等情况。例如,在处理大量数据或复杂任务时,程序内部的算法出现死循环,导致无法继续正常运行;或者在内存分配上出现不合理的情况,使得软件运行到一定阶段无法获取足够的资源来响应新的操作。
解决办法:强制关闭并重启软件或者等待一段时间看它是否能自行恢复。②闪退错误:
错误类型:闪退是指软件或 APP 在运行过程中突然关闭,退回到设备的主屏幕或其他界面。这可能是多种原因导致的,比如软件自身存在漏洞或兼容性问题,设备内存不足,软件与设备系统版本不兼容等。
解决办法:
重启软件:先尝试关闭该软件或 APP(如果它还处于后台运行状态,可以通过设备的任务管理器将其关闭),然后重新打开,看是否还会出现闪退情况。***此问借助AI生成***
2.说出两个你在编写Java程序时最常遇到的错误。并判定这些错误是什么类型的错误(编译错误、运行时错误)。你认为哪种类型的错误更好解决呢?
①语法错误:比如在代码语句的末尾忘记“;”,或者符号类型为中文符号导致编译错误。
②空指针异常:比如下图代码中定义了一个字符串变量 str 并赋值为 null,然后尝试调用它的 length() 方法,就会抛出空指针异常。
这种错误为运行时的错误,运行时能得到以下运行提示:
3.查询JDK文档,说说如下代码哪行抛出了什么类型的异常?为什么该段程序明明可能产生错误,但是不写try…catch,也可编译通过。为上述代码添加try…catch。使得当输入错误时,可提示重新输入,直到输入正确后,才能继续往下执行。
public static void main(String[] args) {
int[] x = new int[3];
Scanner inputScan = new Scanner(System.in);
for(int i = 0; i < x.length;){
System.out.println("Please input the "+i+" integer:");
String inputInt = inputScan.nextLine();
x[i] = Integer.parseInt(inputInt); //注意这里!
i++;
}
System.out.println(Arrays.toString(x)); }
①以上代码中
x[i] = Integer.parseInt(inputInt);
此行代码会抛出异常,异常类型是NumberFormatException
,原因是改行代码中所用的方法只支持传入数字形式的字符串,而不能是字母或符号等非数字字符。控制台抛出异常如下图所示:
②这段程序即使可能产生上述错误,但不写 try…catch 也能编译通过,是因为 NumberFormatException 是一个运行时异常(RuntimeException 的子类)。
③加入try…catch修改后的代码如下:
//修改后的代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] x = new int[3];
Scanner inputScan = new Scanner(System.in);
for (int i = 0; i < x.length;) {
System.out.println("请输入第 " + i + " 个数:");
String inputInt = inputScan.nextLine();
try {
x[i] = Integer.parseInt(inputInt);
i++;
} catch (NumberFormatException e) {
System.out.println("无效输入,请重新输入:");
}
}
System.out.println(Arrays.toString(x));
}
}
运行结果如下图所示:
4. 将如下代码中NumberFormatException改成Exception可以吗?
String x = "abc";
try {
int a = Integer.parseInt(x);
System.out.println(a);
} catch (NumberFormatException e) {
e.printStackTrace();
}
在 Java 中,
NumberFormatException
是Exception
的子类。这意味着NumberFormatException
类型的异常对象是可以被Exception
类型的异常处理块所捕获的。所以从语法角度来说,把catch
块中的异常类型从NumberFormatException
改成Exception
能够通过编译,代码可以正常运行。NumberFormatException
是专门用于处理当尝试将一个字符串转换为数字格式(如通过Integer.parseInt()
等方法)但字符串格式不符合数字要求时抛出的异常。如果改成捕获 Exception,就会把所有类型的异常都捕获到这个 catch 块中,包括可能在 try 块中其他操作(比如除了Integer.parseInt()
之外还有其他可能抛出不同类型异常的代码)引发的异常。这样就失去了对NumberFormatException
这种特定异常情况的针对性处理能力,使得后续排查问题和理解代码逻辑时变得困难,因为不清楚具体是哪种类型的异常导致了进入这个 catch 块。
5.查询JDK文档,说说如下代码哪里抛出了什么异常?该异常意味着吗什么?需要捕获吗?为什么?
String fileName = "abc";
FileReader fileReader = new FileReader(fileName);
①
FileReader fileReader = new FileReader(fileName);
此行代码会抛出异常。抛出的异常类型为FileNotFoundException
。如下图所示:
②该异常意味着系统找不到指定位置的文件。
③需要捕获:这种情况下是需要捕获该异常的。因为 FileNotFoundException 属于检查异常(它是 IOException 的子类,而 IOException 属于检查异常范畴)。在 Java 中,对于检查异常,编译器要求要么在当前方法中通过 try…catch 块来处理该异常,要么在方法签名中使用 throws 关键字声明抛出该异常,否则代码将无法通过编译。这是为了确保程序在可能遇到这类可预见的、与外部资源(如文件系统)交互相关的异常情况时,有相应的处理机制,以避免程序因未处理的异常而意外终止,保证程序的健壮性和稳定性。