亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 掃描器從我的文本文件中讀取 null?

Java 掃描器從我的文本文件中讀取 null?

慕森卡 2023-04-26 15:10:48
我正在編寫一些代碼來讀取書名的輸入文件,并將讀取的行放入一個數組并嘗試打印出該數組。但是當我嘗試打印出數組時,它只是為每個讀取行返回“null”。我不確定我做錯了什么或我的代碼在做什么。有什么建議么?謝謝!代碼:    import java.io.*;import java.util.*;public class LibraryInputandOutputs {    public static void main(String args[]) throws IOException{        int lineCount = 0;        File inputFile = new File("bookTitles.inp.txt");        Scanner reader = new Scanner(inputFile);        while(reader.hasNextLine()) {            reader.nextLine();            lineCount++;        }        String[] bookArray = new String[lineCount];        while (reader.hasNextLine()) {            for (int i = 0; i < lineCount; i++) {                bookArray[i] = reader.next();             }        }        for (int k = 0; k < lineCount; k++) {            System.out.println(bookArray[k]);        }        reader.close();        inputFile.close();    }}我正在閱讀的文本文件有 20 個書名,每行都不同。我在終端上的輸出是 20 行空值。
查看完整描述

3 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

讓我們分解一下:

  1. 這將讀取輸入文件的每一行,計算每一行,然后丟棄它們:

    while(reader.hasNextLine()) {
        reader.nextLine();
        lineCount++;
    }

    您現在位于文件末尾。

  2. 分配一個足夠大的字符串數組。

    String[] bookArray = new String[lineCount];
  3. 嘗試閱讀更多行。循環將立即終止,因為reader.hasNextLine()將返回false。您已經在文件末尾。

    所以你分配給的語句bookArray[i]不會被執行。

    while (reader.hasNextLine()) { 
       for (int i = 0; i < lineCount; i++) {
            bookArray[i] = reader.next();
         }
    }
  4. 由于bookArray[i] = ...上面從未執行過,所有數組元素仍將是null.

    for (int k = 0; k < lineCount; k++) {
        System.out.println(bookArray[k]);
    }

一種解決方案是打開并讀取文件兩次。

另一種解決方案是將文件“重置”回開頭。(有點復雜。)

另一種解決方案是使用 aList而不是數組,這樣您就不需要讀取文件兩次。

另一種解決方案是在 javadoc 中搜索一種方法,該方法會將文件/流的所有行讀取為字符串數組。

(其中一些可能會因您的練習要求而 被排除。將其解決...)


第3步的嵌套循環也是錯誤的。您不需要在 while 循環中使用 for 循環。您需要一個循環來“遍歷”行并遞增數組索引 ( i)。它們不需要都由循環語句本身來完成。您可以在循環體中執行一個或另一個(或兩個)。


查看完整回答
反對 回復 2023-04-26
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

您試圖在文件中循環兩次,但您已經在第一次到達文件末尾。不要循環兩次。將兩個 while 循環“合并”為一個,刪除 while 循環內的 for 循環并收集所有書名。然后您可以使用列表的大小稍后打印它們。我的 Java 可能生銹了,但它在這里 -


import java.io.*;

import java.util.*;

public class LibraryInputandOutputs {

? ? public static void main(String args[]) throws IOException {


? ? ? ? // int lineCount = 0; - You don't need this.


? ? ? ? File inputFile = new File("bookTitles.inp.txt");

? ? ? ? Scanner reader = new Scanner(inputFile);


? ? ? ? // Use an array list to collect book titles.

? ? ? ? List<String> bookArray = new ArrayList<>();?


? ? ? ? // Loop through the file and add titles to the array list.

? ? ? ? while(reader.hasNextLine()) {

? ? ? ? ? ? bookArray.add(reader.nextLine());

? ? ? ? ? ? // lineCount++; - not needed

? ? ? ? }


? ? ? ? // Not needed -

? ? ? ? // while (reader.hasNextLine()) {

? ? ? ? //? ? ?for (int i = 0; i < lineCount; i++) {

? ? ? ? //? ? ? ? ?bookArray[i] = reader.next();

? ? ? ? //? ? ? }

? ? ? ? // }


? ? ? ? // Use the size method of the array list class to get the length of the list?

? ? ? ? // and use it for looping.

? ? ? ? for (int k = 0; k < bookArray.size(); k++) {??

? ? ? ? ? ? System.out.println(bookArray[k]);

? ? ? ? }


? ? ? ? reader.close();

? ? ? ? inputFile.close();


? ? }

}


查看完整回答
反對 回復 2023-04-26
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

特別是,使用 List 通常比使用數組更好,因為它更靈活。如果你需要一個數組,你總是可以在 List 被填充后使用 toArray() 。

你的書名是分開的嗎?如果是這樣,您可能不需要 Scanner 類,可以使用 BufferedReader 或 LineNumberReader 之類的東西。


查看完整回答
反對 回復 2023-04-26
  • 3 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號