Java 资源泄漏问题
我是Java编程的初学者,这是我家庭作业中的一个简单的“计算器”代码。我希望我的代码既简单又有效,并为此付出了很大的努力。检查代码后,会弹出一条警告消息:“资源泄漏:sc从未关闭”。我知道如果不添加“sc.close();”,它仍然可以正常运行,但我希望我的程序是完美的,并在第44行和第111行添加了“sc.close();”语句。添加语句后,关于资源泄漏的警告消失了,但当我运行代码时,程序会要求进行另一次计算,此时会弹出一个调试控制台Java 资源泄漏问题,java,memory-leaks,Java,Memory Leaks,我是Java编程的初学者,这是我家庭作业中的一个简单的“计算器”代码。我希望我的代码既简单又有效,并为此付出了很大的努力。检查代码后,会弹出一条警告消息:“资源泄漏:sc从未关闭”。我知道如果不添加“sc.close();”,它仍然可以正常运行,但我希望我的程序是完美的,并在第44行和第111行添加了“sc.close();”语句。添加语句后,关于资源泄漏的警告消失了,但当我运行代码时,程序会要求进行另一次计算,此时会弹出一个调试控制台 我不确定为什么会弹出调试控制台,您认为问题是什么 您应该看
我不确定为什么会弹出调试控制台,您认为问题是什么 您应该看到“潜在资源泄漏…”警告,如果没有,请打开一个bug。 这里的主要问题是编译器不知道“close(..)”方法的作用。它可能关闭资源,也可能不关闭资源。(请注意,编译器不执行过程间分析) 您可以选择忽略“潜在资源泄漏”警告。(“资源泄漏”警告保证正确,但“潜在…”警告不正确) 有关资源泄漏分析的更多详细信息,请参见: 编辑:“资源泄漏”与“潜在资源泄漏”之比较 其思想是,所有报告的“资源泄漏”警告都保证是正确的,但可能不是代码库中的“所有”资源泄漏。 “潜在的资源泄漏”是很好的。。。潜在问题。一些开发人员在知道出了问题但不知道在哪里时会打开“潜在…”警告。在这种情况下,潜在的警告有助于缩小搜索范围。其他一些开发人员只是不时查看潜在的警告,看看是否存在真正的问题。 理想情况下,我们希望编译器为我们提供完整、正确的问题集,但实现这一点存在局限性:-)
import java.util.Scanner;
class Operation {
double add(double a, double b){
double c;
c = a+b;
return c;
}
double sub(double a, double b){
double c;
c = a-b;
return c;
}
double mul(double a, double b){
double c;
c = a*b;
return c;
}
double div(double a, double b){
double c;
c = a/b;
return c;
}
}
class Selection{
static double x,y;
void func(int a){
Scanner sc = new Scanner(System.in);
char b;
if(a==1)
b='+';
else if(a==2)
b='-';
else if(a==3)
b='*';
else
b='/';
System.out.println(">>You have selected "+b+" operator");
System.out.println(">>Please enter the first operand.");
x = sc.nextDouble();
System.out.println(">>Please enter the second operand.");
y = sc.nextDouble();
sc.close(); //line 44, this statement gave me a problem.
}
}
public class Calculator {
static int select;
@SuppressWarnings("static-access")
public static void main(String [] args){
Operation op = new Operation();
Selection sel = new Selection();
Scanner sc = new Scanner(System.in);
boolean run = true;
while(run){
System.out.printf(">>Select Operator\n>>1: + 2: - 3: * 4: /\n");
select = sc.nextInt();
double a = sel.x;
double b = sel.y;
double result;
switch(select){
case 1:
sel.func(1);
a = sel.x;
b = sel.y;
result = op.add(a, b);
System.out.println(">>The result of "+a+" + "+b+" is "+result);
break;
case 2:
sel.func(2);
a = sel.x;
b = sel.y;
result = op.sub(a,b);
System.out.println(">>The result of "+a+" - "+b+" is "+result);
break;
case 3:
sel.func(3);
a = sel.x;
b = sel.y;
result = op.mul(a,b);
System.out.println(">>The result of "+a+" * "+b+" is "+result);
break;
case 4:
sel.func(4);
a = sel.x;
b = sel.y;
result = op.div(a,b);
System.out.println(">>The result of "+a+" / "+b+" is "+result);
break;
default:
System.out.println(">>Your number is not available, please try again!");
System.out.println();
System.out.println();
continue;
}
System.out.println(">>Do you want to exit the program(y)?");
String startOver = sc.next();
if(startOver.equals("y")){
run = false;
System.out.println(">>Thank you for using my program!");
}else{
System.out.println();
continue;
}
sc.close(); //line 111, this works fine i think.
}
}
}