java - 如何优雅地处理错误输入(JAVA)
问题描述
这是我的代码:我想输入整数,如果我输入一个字符串,我会得到一个异常,但是我的 try catch 不起作用。我只需要帮助来优雅地处理输入。谢谢。我正在为大学作业做这个,坦率地说,我不知道该怎么做,因为他在课堂上提供的例子不一定适用。
public static void main (String[]args) {
Assignment2 game = new Assignment2();
game.playWordSearch();
// System.out.println(game.numRowCol());
//System.out.printf("The words to find: %n %s%n %s%n %s%n %s%n %s%n %n", game.wordStorage(), game.wordStorage(), game.wordStorage(), game.wordStorage(), game.wordStorage());
}
Scanner keyboard = new Scanner(System.in);
private int[][] wordBoard;
private String[] wordList;
private static int row;
private static int col;
public void playWordSearch(){
wordBoard = numRowCol();
wordStorage();
}
public int[][] numRowCol(){
int array[] = new int[2];
for(int i=0; i<=1; i++) {
System.out.printf("Enter a number between (2-15): %n");
array[i] = keyboard.nextInt();
}
try {
System.out.println(array[0]);
System.out.println(array[1]);
} catch (
java.util.InputMismatchException mismatchException) {
System.out.printf("That created an exception, the message is %s%n", mismatchException.getMessage());
}
int arrayArray [][] = new int[array[0]][array[0]];
return arrayArray;
}
public String wordStorage(){
Scanner keyboard = new Scanner(System.in);
System.out.printf("Enter a word with less than 8 characters: ");
String word = keyboard.nextLine();
return word;
}
}
解决方案
您可能希望在代码中做一些事情:
- 将 main 方法移动到它自己的空 Runner 类中。它所做的只是实例化并运行
Assignment2
。 - 确保您的字段是您在课堂上定义的第一件事。它使您的代码更容易阅读。
- 通常,静态字段全部大写。这当然只是一个约定。你会在网上找到很多风格指南,例如Google 的指南。
- 了解您的错误。
我运行了您的代码并输入了一个字符串(java)。结果是:
Enter a number between (2-15):
java
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at eu.webfarmr.Assignment2.numRowCol(Assignment2.java:35)
at eu.webfarmr.Assignment2.playWordSearch(Assignment2.java:26)
at eu.webfarmr.Assignment2.main(Assignment2.java:15)
堆栈跟踪实际上告诉您错误发生的位置 (Assignment2.java:35)。所以你知道这是你需要包装在 try/catch 中的部分代码。
例如你可以这样做:
public int[][] numRowCol() {
int array[] = new int[2];
try {
for (int i = 0; i <= 1; i++) {
System.out.printf("Enter a number between (2-15): %n");
array[i] = keyboard.nextInt();
}
System.out.println(array[0]);
System.out.println(array[1]);
} catch (java.util.InputMismatchException mismatchException) {
System.out.printf("That created an exception, the message is %s%n", mismatchException.getMessage());
} catch (Exception err) {
System.out.println("Another error occurred.");
err.printStackTrace();
}
int arrayArray[][] = new int[array[0]][array[0]];
return arrayArray;
}
但也许您应该将输入读取为字符串,然后尝试将输入转换为整数/双精度/其他。这将使您更好地控制转换过程。
另外,你想想想失败意味着什么。在您的情况下,您最终会得到一个部分初始化的值数组。
推荐阅读
- javascript - 如何从下面的文本 JavaScript 创建 JSON 对象
- kotlin - 在 Kotlin 中反跳用户输入
- python - 一般迭代python数据类注释
- python - 停止运行已编译 c 模块中存在的无限循环的 python 脚本
- c++ - C++ Eigen 的 SelfAdjointEigenSolver 在矩阵中使用零时不会更快
- android - 如何使用 expo 一次向所有 android 和 ios 设备发送推送通知以响应本机?
- javascript - 单击指向不同网站的超链接时显示的本地路径
- reactjs - 在功能组件中使用 MobX @inject 和 Context API
- android - AWS Amplify 可以做 MQTT 吗?
- python - 如何将时间戳添加到配置(ini)文件?