我只是希望有人审核我的代码和建议,以便将其改进为一个编写良好的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行(返回坐标;)请有人解释我这个
答案 0 :(得分:2)
每次循环运行时,您都不必实例化Scanner
对象in
。因此,将Scanner in = new Scanner(System.in);
置于while
循环之上。
return
阻止内部if
不需要valid = true
。因为if
内部的false
阻止了while
内部的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;
}
条件,它会突破循环。
请改用此代码:
System.in
每当您使用任何语言(大多数语言)打开代码中的外部资源(I / O)时,都必须关闭该外部资源。
总是你必须在完成后关闭处理I / O的类的实例。
此外部资源为in.close()
,您已打开它以接收输入,但在您工作后您没有关闭该资源。这就是为什么要求你关闭它。
如果您关闭扫描仪in
,则下次无法使用in.close()
获取输入,除非您通过实例化再次打开它。
在return
语句上方添加Scanner
,不应出错。
修改强>
问题是我们正在getinput()
关闭System.in
,static
也在关闭Scanner
,正如评论中“Henry”所说的那样。
因此请将其声明为main()
并关闭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
}
}
末尾的private FileAppender appender = new FileAppender();
log.addAppender(appender);
。
<强>代码:强>
private ValueMember AddField(int fieldNumber, string memberName, Type itemType, Type defaultType, object defaultValue)
答案 1 :(得分:-1)
在一行中处理多个输入时
您应该使用以下行添加到您的代码
String[] in= lines.trim().split("\\s+");
for (int i = 0; i < 2; i++) {
a[i] = Integer.parseInt(in[i]);
}
您可能不知道用户是否按此顺序输入数据,程序[之前]将无法解析它导致该功能无法正常运行。