Java Eclipse正在关闭扫描程序,但仍出现错误

5vf7fwbs  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(191)

我相当新的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);在相同的方法中运行,并且在那里运行良好。

ibps3vxo

ibps3vxo1#

我知道你应该总是关闭你的扫描仪一旦你完成使用它
不,这是完全错误的。您应该关闭扫描仪。
问题是:Resources 应该被关闭,然而,有一种特殊的对象,叫做“filter resource”,它是一种半资源半非资源的类型。因此,"代码应该关闭它吗“是一个自动化的linting工具通常无法正确回答的难题。不幸的是,他们尝试了,因此,有时会出错。这就是其中的一个例子。
过滤器流“ Package ”一个 * 实际 * 资源。为了避免用完操作系统级别的文件句柄等,它们本身不包含任何此类内容,因此不需要关闭它们(但是,它们 Package 的内容很可能是应该 Package 的系统资源)。筛选器可以缓存值,所以至少需要刷新它们--关闭它们会刷新它们,所以通常关闭filterstream会更方便(这也会关闭底层的数据流),而IDE中的工具会标记您未能正确关闭某个资源,它们不愿意为区分读操作(流)和写操作而费心。“刷新行”显然不适用于读操作。
回到真正的资源(Scanner将 Package 的内容)--有这样一个问题,即 * 谁负责 * 关闭它。就是那个人。

您没有创建System.in--因此,您不能关闭它。因此,如果您创建了一个filterstream,它环绕了一个不是您创建的流,您也不应该关闭它。

结论:new Scanner(System.in)一定不能关闭。是的,非常不幸的是,IDE搞砸了,有时过于热心地告诉你应该关闭。你永远不应该关闭System.in,除非你特别要求这样做,因为你正在实现一个工具,它使用“关闭sysin”作为一个信号,给给你的进程提供数据,一个消息传递机制,这是不推荐的。
关于代码的一些进一步说明:

  • 在java中,我们写MethodNamesLikeThis,而不是_like_this。我们用同样的方式写局部变量(所以,x,而不是X)。语言规范并不要求你这样做,但是所有的教程和99.99%的java程序员都是这样做的。不这样做意味着每个人都会在阅读你的代码时感到困惑,而你读过的或正在写的别人写的代码会让你感到困惑。
  • 调用main(null)意味着你建立了一个永不结束的递归过程。(想要测试它吗?暂时将getUserInput方法中的.nextInt()调用替换为返回一个常量并标记出.nextLine()行,运行它,呈现重复的主菜单的正确方法是使用while循环或do {} while循环,而不是调用您自己的方法。
  • 为了确保一个东西是封闭的,你可以像在getUserInput方法中那样使用try-finally,或者,有一个更简单的构造:
try (Scanner s = new Scanner(System.in)) {
  // code using 's' here
}

这将生成这样的代码:无论代码如何退出此块(通过return;,通过break;,通过一个循环来环绕这个代码,或者通过抛出一个异常,或者通过运行到最后并“退出”,这些都无关紧要)-s.close()被调用。现在,你不应该对这个代码这样做,因为scanner不应该被关闭,但是 * 下次 * 你打开一个真正需要关闭真实的资源时,你就是这样做的。你根本不需要resource.close();,你可以使用try-with,就像上面一样。

lo8azlld

lo8azlld2#

将这两个方法封装在一个公共类中。
将ms_calc方法名称重新命名为main。
&
删除主(空)线。2你就可以开始了。

相关问题