我只希望某人查看我的代码并建议将其改进为写得很好的Java代码。我正在做的是使用扫描仪获得用户输入,直到用户输入数量为0-10。
int Ai = getInput("i", "A");
int Aj = getInput("j", "A");
int Bi = getInput("i", "B");
int Bj = getInput("j", "B");
private static int getInput(String axis, String point) {
int coordinate = 0;
boolean valid = false;
while(!valid){
Scanner in = new Scanner(System.in);
System.out.println("Enter "+ axis +" for " + point +" > ");
if (in.hasNextInt()){
coordinate = in.nextInt();
if (coordinate >= 0 && coordinate <10){
valid = true;
return coordinate;
}
}
}
return coordinate;
}
,但我在第11行(返回坐标)中收到警告"资源泄漏:'in"在此位置没有关闭;
您不必每次运行循环时都要实例化Scanner
对象in
。因此,将Scanner in = new Scanner(System.in);
放置在while
环上。
您不需要return
内部的CC_5。因为valid = true
内部if
块,该块在while
中评估false
的条件中断,从而突破了循环。
而是使用此代码:
private static int getInput(String axis, String point) {
int coordinate = 0;
boolean valid = false;
Scanner in = new Scanner(System.in);
while(!valid)
{
if (in.hasNextInt()){
coordinate = in.nextInt();
if (coordinate >= 0 && coordinate <10){
valid = true;
}
}
}
in.close();
return coordinate;
}
每当您以任何语言(其中大多数)打开代码中的外部资源(I/O)时,您都必须关闭该外部资源。
始终您必须关闭与I/O结束后与I/O的课程实例。
在这里,外部资源是System.in
,您已经打开它以获取输入,但是在工作后,您没有关闭该资源。这就是为什么它要求您关闭它。
如果您关闭扫描仪in.close()
,则不能使用in
下次获取输入,除非您再次实例化。
在两个return
语句上方添加in.close()
,并且应该没有错误。
编辑:
问题是我们正在关闭Scanner
中的CC_16,该评论中的"亨利"也关闭了System.in
。
因此将其声明为static
,并在main()
末尾关闭Scanner
。
代码:
import java.util.Scanner;
public class Main{
static Scanner in = new Scanner(System.in); //Declared as Static
private static int getInput(String axis, String point) {
int coordinate = 0;
boolean valid = false;
while(!valid)
{
System.out.println("Enter "+ axis +" for " + point +" > ");
if (in.hasNextInt()){
coordinate = in.nextInt();
if (coordinate >= 0 && coordinate <10){
valid = true;
}
}
}
return coordinate;
}
public static void main(String[] args) throws Exception
{
int Ai = getInput("i", "A");
int Aj = getInput("j", "A");
int Bi = getInput("i", "B");
int Bj = getInput("j", "B");
in.close(); // close the scanner when your program is about to end
}
}
在处理单行中的多个输入时
您应该使用代码的附加行
String[] in= lines.trim().split("\s+");
for (int i = 0; i < 2; i++) {
a[i] = Integer.parseInt(in[i]);
}
您可能不知道用户是否按照此顺序输入数据[较早]无法解析,从而导致该功能无法正常采取行动。