我相当新的java和我想创建一个BPM到毫秒转换器为我的吉他延迟踏板只是一个有趣的小边项目。我知道你应该总是关闭你的扫描仪一旦你使用它,但我的代码将无法工作,如果它关闭。
public static void main(String[] args) {
ms_calc();
}
public static void ms_calc () {
Scanner scanbpm = new Scanner(System.in);
System.out.println("What is your BPM?");
int bpm = get_user_int (scanbpm,1,2300);
double mS1 = Math.round((bpm*100)/6)*4;
double mS2 = Math.round((bpm*100)/6)*2;
int mS1R = (int)mS1;//casting doubles as ints
int mS2R = (int)mS2;
System.out.println("____________________________________");
System.out.println();
System.out.println("Whole : " + mS1R + " ms");
System.out.println();
System.out.println("1/2 : " + mS2R+ " ms");
for (int X = 1; X < 9; X = X * 2) {
double mS = Math.round((60000.00/X)/bpm);
int Y = X * 4;
int mSR = (int)mS;
System.out.println();
System.out.println("1/" +Y + " : "+ mSR+ " ms");
}
System.out.println("____________________________________");
System.out.println();
scanbpm.close();
main(null);
}
public static int get_user_int(Scanner scan, int min, int max) {
int user_input = min - 1;
boolean keep_asking = true;//boolean to regulate the while loop
while(keep_asking || user_input < min || user_input > max) {
try {//try this code not sure it's going to work
user_input=scan.nextInt();
keep_asking = false;
}catch(Exception e) {
System.out.println("Invalid input.");
}finally {
scan.nextLine();
}
}
System.out.println(user_input);
return user_input;
}
get_user_int是在类中生成的,并且在我所做的其他项目中也可以使用。Eclipse在第1651行运行一个错误,说找不到行。我唯一的猜测是它必须是main(null)的内容;但我有一个扫描器和main(null);在相同的方法中运行,并且在那里运行良好。
2条答案
按热度按时间ibps3vxo1#
我知道你应该总是关闭你的扫描仪一旦你完成使用它
不,这是完全错误的。您应该不关闭扫描仪。
问题是:Resources 应该被关闭,然而,有一种特殊的对象,叫做“filter resource”,它是一种半资源半非资源的类型。因此,"代码应该关闭它吗“是一个自动化的linting工具通常无法正确回答的难题。不幸的是,他们尝试了,因此,有时会出错。这就是其中的一个例子。
过滤器流“ Package ”一个 * 实际 * 资源。为了避免用完操作系统级别的文件句柄等,它们本身不包含任何此类内容,因此不需要关闭它们(但是,它们 Package 的内容很可能是应该 Package 的系统资源)。筛选器可以缓存值,所以至少需要刷新它们--关闭它们会刷新它们,所以通常关闭filterstream会更方便(这也会关闭底层的数据流),而IDE中的工具会标记您未能正确关闭某个资源,它们不愿意为区分读操作(流)和写操作而费心。“刷新行”显然不适用于读操作。
回到真正的资源(Scanner将 Package 的内容)--有这样一个问题,即 * 谁负责 * 关闭它。就是那个人。
您没有创建
System.in
--因此,您不能关闭它。因此,如果您创建了一个filterstream,它环绕了一个不是您创建的流,您也不应该关闭它。结论:
new Scanner(System.in)
一定不能关闭。是的,非常不幸的是,IDE搞砸了,有时过于热心地告诉你应该关闭。你永远不应该关闭System.in,除非你特别要求这样做,因为你正在实现一个工具,它使用“关闭sysin”作为一个信号,给给你的进程提供数据,一个消息传递机制,这是不推荐的。关于代码的一些进一步说明:
x
,而不是X
)。语言规范并不要求你这样做,但是所有的教程和99.99%的java程序员都是这样做的。不这样做意味着每个人都会在阅读你的代码时感到困惑,而你读过的或正在写的别人写的代码会让你感到困惑。main(null)
意味着你建立了一个永不结束的递归过程。(想要测试它吗?暂时将getUserInput方法中的.nextInt()
调用替换为返回一个常量并标记出.nextLine()
行,运行它,呈现重复的主菜单的正确方法是使用while
循环或do {} while
循环,而不是调用您自己的方法。getUserInput
方法中那样使用try-finally
,或者,有一个更简单的构造:这将生成这样的代码:无论代码如何退出此块(通过
return;
,通过break;
,通过一个循环来环绕这个代码,或者通过抛出一个异常,或者通过运行到最后并“退出”,这些都无关紧要)-s.close()
被调用。现在,你不应该对这个代码这样做,因为scanner不应该被关闭,但是 * 下次 * 你打开一个真正需要关闭真实的资源时,你就是这样做的。你根本不需要resource.close();
,你可以使用try-with,就像上面一样。lo8azlld2#
将这两个方法封装在一个公共类中。
将ms_calc方法名称重新命名为main。
&
删除主(空)线。2你就可以开始了。