簡體   English   中英

為執行程序服務定義文件路徑

[英]Defining a file path for an executor service

我正在編寫一個程序,它將接受用戶對文件的輸入,即:

            if (option == 1) {
                System.out.print("Enter text file path: ");
                bookFile = scanner.next();
            }

定義文件路徑后,它將進入執行程序:

        // Parse book file concurrently
        executor.execute(() -> {
            try {
                parseBookFile(bookFile, wordIndex);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

我遇到的問題是 bookfile 有下划線說明:在封閉范圍內定義的局部變量 bookFile 必須是最終的或有效的最終的

而且我似乎找不到解決這個問題的方法,因為文件路徑在定義它之前不能是最終的。 唯一有用的是使用執行程序本身定義文件路徑,但這確實會擾亂程序的其余部分

我試圖在執行程序中定義文件路徑,但它沒有成功,因為下一個代碼塊正在定義更多文件路徑,但如果有意義,用戶必須選擇這樣做。

看起來您面臨的問題是由匿名內部類(即 execute 方法的 lambda 函數)中使用 bookFile 變量這一事實引起的。 在 Java 中,如果在匿名內部類中使用局部變量,則必須將其標記為 final 或有效的 final。

解決此問題的一種方法是將 bookFile 變量定義為封閉類的一個字段,而不是 if 塊中的局部變量。 這樣,可以從匿名內部類中訪問和修改變量而不會出現任何問題。

或者,您也可以使用方法參數將 bookFile 的值傳遞給匿名內部類,而不是將其作為局部變量訪問。 例如:

executor.execute(() -> { try { parseBookFile(bookFile, wordIndex); } catch (Exception e) { e.printStackTrace(); } });

我希望這有幫助。 如果您還有其他問題,請告訴我。

一種可能的解決方案是使用實現 Runnable 的類,以便按如下方式傳遞變量:

        class MyJob implements Runnable{
            private final int wordIndex;
            private final String bookFile;
            public MyJob(String bookFile,int wordIndex){
                this.wordIndex = wordIndex;
                this.bookFile = bookFile;
            }
             public void run(){
                    
                    try {
                        parseBookFile(bookFile, wordIndex);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
             }
        }

所以,你可以這樣運行一個線程:

executor.execute( new MyJob(bookFile,wordIndex));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM