有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么会出现异常主“线程”错误?

我创建了两个类(和两个接口),然后是一个主代码。我只是调试了主代码,因为我遇到了一个错误,使我的代码无法正常工作。我知道我的项目中存在的问题。java文件位于第29行,该行为input=userInput。nextLine()。错误是: 线程“main”java中出现异常。util。NoSuchElementException:未找到行 在爪哇。util。扫描仪。nextLine(Scanner.java:1585) 在项目03。main(Project03.java:29)

为什么会出现错误?我如何防止它?非常感谢。 代码如下: 简单的轨道。爪哇

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;
}
}

播放曲目。爪哇

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。爪哇

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;
}

}

播放列表。爪哇

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

}

项目03。爪哇

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) 个答案

  1. # 1 楼答案

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

    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
    }
    

    Using multiple scanners on the same stream is the underlying problem. Scanners can (and will) consume the stream - this may (will) lead to unexpected side-effects. Best not to do it.

    If the input is closed, then the input [...] is closed for everyone - and that's not much fun for anyone.

    "Details" on why multiple scanners are bad: Do not create multiple buffered wrappers on an InputStream

    - from user166390's answer on How to use multiple Scanner objects on System.in?