为什么我收到异常主“线程”错误?

时间:2015-02-18 23:14:36

标签: java java.util.scanner

我创建了两个类(和两个接口),然后是一个主代码。我只是调试了主要代码,因为我收到的错误导致我的代码无法正常工作。我知道我的Project03.java文件中的问题在第29行,而行是input = userInput.nextLine(); 。错误是: 线程" main"中的例外情况java.util.NoSuchElementException:找不到行     at java.util.Scanner.nextLine(Scanner.java:1585)     在Project03.main(Project03.java:29)

为什么会出现错误,如何防止错误?谢谢! 代码如下: SimpleMusicTrack.java

import java.util.Scanner;
import java.lang.Object;
public class SimpleMusicTrack implements PlayListTrack {

private String name;
private String artist;
private String albumName;

// Convenience constructor for unit testing
public SimpleMusicTrack(String name, String artist, String album) {
    this.name = name;
    this.artist = artist;
    this.albumName = album;
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public String getArtist() {
    return this.artist;
}

public void setArtist(String artist) {
    this.artist = artist;
}

public String getAlbum() {
    return this.albumName;
}

public void setAlbum(String album) {
    this.albumName = album;
}

public boolean getNextTrack(Scanner infile) {
    if (infile == null)
        return false;
    while (infile.hasNext()) {
        this.setName(infile.nextLine());
        this.setArtist(infile.nextLine());
        this.setAlbum(infile.nextLine());
        return true;
    }
    return false;
}

public boolean equals(Object obj) {
    boolean songInfo;
    if (obj instanceof MusicTrack) {
        MusicTrack name1 = (MusicTrack) obj;
        if (this.name.equals(name1.getName())
                && this.artist.equals(name1.getArtist())
                && this.albumName.equals(name1.getArtist())) {
            songInfo = true;
        } else {
            songInfo = false;
        }
    } else {
        songInfo = false;
    }
    return songInfo;
}

public String toString() {
    String allSongInfo;
    allSongInfo = this.artist + " / " + this.name;
    return allSongInfo;
}
}

PlayListTrack.java

import java.util.Scanner;
public interface PlayListTrack {
public String getName();
public void setName(String name);
public String getArtist();
public void setArtist(String artist);
public String getAlbum();
public void setAlbum(String album);
public boolean getNextTrack(Scanner infile);

    // Attempts to read a play list track entry from a Scanner object
    // Sets the values in the object to the values given in
    // the file
    // If it successfully loads the track, return true
    // otherwise, return false
}

SimplePlayList.java

import java.util.*;
import java.util.Queue;

public class SimplePlayList implements PlayList {
Queue<PlayListTrack> queue;

public SimplePlayList(Scanner in) {
    queue = new LinkedList<PlayListTrack>();
    readFile(in);
}

public void readFile(Scanner in) {
    Scanner inScanner = new Scanner(System.in);
    Queue<PlayListTrack> queue = new LinkedList<PlayListTrack>();

    while (in.hasNext()) {

        queue.add(new SimpleMusicTrack(in.nextLine(), in.nextLine(), in
                .nextLine()));
    }
    inScanner.close();
}

public PlayListTrack getNextTrack() {
    while (!queue.isEmpty()) {
        queue.remove();
    }
    return queue.peek();
}

public PlayListTrack peekAtNextTrack() {
    while (!queue.isEmpty()) {
        queue.peek();
    }
    return queue.peek();
}

public void addTrack(PlayListTrack track) {
    while (!queue.isEmpty()) {
        queue.add(track);
    }
}

public boolean isEmpty() {
    while (!queue.isEmpty()) {
        return false;
    }
    return true;
}

}

PlayList.java

public interface PlayList {

public PlayListTrack getNextTrack();

// Removes track from PlayList and returns it to the caller
// Should return a null value if the PlayList is empty

public PlayListTrack peekAtNextTrack();

// Returns next entry to the caller, but leaves it in the list

public void addTrack(PlayListTrack track);

// Adds this track to the play list in the appropriate order

public boolean isEmpty();
// Returns true if the play list is empty

}

Project03.java

import java.io.File;
import java.io.*;
import java.util.Scanner;

public class Project03 {

public static void main(String[] args) {
    Scanner userInput = new Scanner(System.in);
    System.out.print("Enter database filename: ");
    String fileName = userInput.nextLine();
    try {
        File file = new File(fileName);
        Scanner musicList = new Scanner(file);
        String input = "P";
        PlayList playList = new SimplePlayList(musicList);
        while (!"Q".equalsIgnoreCase(input)) {
            if ("A".equalsIgnoreCase(input)) {
                displayAddTrackOption(userInput, playList);
                input = "";
            } else {
                displayNextSong(playList);
                System.out.print("> ");
                input = userInput.nextLine();
            }
        }

        displayRemainingTracks(playList);
    } catch (FileNotFoundException e) {
        System.out.println("Sorry, could not find your file");
    }
}

private static void displayRemainingTracks(PlayList playList) {
    System.out
            .println("Tracks remaining in play list------------------------------------------------------------");
    if (!playList.isEmpty()) {
        boolean hasAnotherTrack = true;
        int lineNumber = 1;
        while (hasAnotherTrack) {
            MusicTrack currentTrackToPlay = (MusicTrack) playList
                    .getNextTrack();
            if (currentTrackToPlay != null) {
                System.out.printf("%d - %s / %s / %s\n", lineNumber,
                        currentTrackToPlay.getName(),
                        currentTrackToPlay.getArtist(),
                        currentTrackToPlay.getAlbum());
                lineNumber++;
            } else
                hasAnotherTrack = false;
        }
    } else
        System.out.println("No tracks remaining");
}

private static void displayAddTrackOption(Scanner userInput,
        PlayList playList) {
    String title, artist, album, confirmation;
    System.out.print("Track name: ");
    title = userInput.nextLine();
    System.out.print("Artist name: ");
    artist = userInput.nextLine();
    System.out.print("Album name: ");
    album = userInput.nextLine();
    System.out.println("New Track: " + title);
    System.out.println("Artist: " + artist);
    System.out.println("Album: " + album);
    System.out.print("Are you sure you want to add this track [y/n]? ");
    confirmation = userInput.nextLine();
    if ("Y".equalsIgnoreCase(confirmation)) {
        playList.addTrack((PlayListTrack) new SimpleMusicTrack(title,
                artist, album));
    }
}

private static void displayNextSong(PlayList playList) {
    MusicTrack currentMusicTrackToPlay;
    MusicTrack nextMusicTrackToPlay;
    currentMusicTrackToPlay = (MusicTrack) playList.getNextTrack();
    nextMusicTrackToPlay = (MusicTrack) playList.peekAtNextTrack();
    if (currentMusicTrackToPlay != null) {
        System.out.println("Currently playing: "
                + currentMusicTrackToPlay.getName() + " / "
                + currentMusicTrackToPlay.getArtist());
    } else {
        System.out.println("Currently playing: No Song Playing");
    }
    if (nextMusicTrackToPlay != null) {
        System.out.println("Next track to play: "
                + nextMusicTrackToPlay.getName() + " / "
                + nextMusicTrackToPlay.getArtist());
    } else {
        System.out.println("Play list is empty, no more tracks");
    }
    System.out.println("[P]lay next track");
    System.out.println("[A]dd a new track");
    System.out.println("[Q]uit");
}
}

1 个答案:

答案 0 :(得分:0)

您在同一个信息流(Scanner)上使用了两个System.in。第一个是userInput类的main方法中的Project03。第二个是inScannerreadFile方法中的SimplePlayList

public void readFile(Scanner in) {
    Scanner inScanner = new Scanner(System.in); // <-- remove this line
    Queue<PlayListTrack> queue = new LinkedList<PlayListTrack>();

    while (in.hasNext()) {

        queue.add(new SimpleMusicTrack(in.nextLine(), in.nextLine(), in
                .nextLine()));
    }
    inScanner.close(); // <--- remove this line
}
  

在同一个流上使用多个扫描程序是潜在的问题。扫描仪可以(并且将会)消耗流 - 这可能(将)导致意外的副作用。最好不要这样做。

     

如果输入已关闭,那么每个人都会关闭输入[...],这对任何人来说都不是很有趣。

     

&#34;详情&#34;为什么多个扫描仪坏了:Do not create multiple buffered wrappers on an InputStream

     

- 来自user166390对How to use multiple Scanner objects on System.in?

的回答