java - TomCat - 构造函数在尝试从文件中读取时抛出异常

标签 java tomcat

我有下面的一些方法,基本上我的问题是当我尝试从 .txt 文件中读取时。该应用程序在内存中运行良好。当我将 decode() 添加到重载构造函数时,我在 Tomcat 服务器日志中收到以下错误:

Constructor threw exception; nested exception is java.lang.NumberFormatException: For input string: ""

当我仔细查看它时,它指向解码方法中的这一行 currentDVD.setDvdId(Integer.parseInt((currentTokens[0]))); 但我似乎无法弄清楚问题是什么。有一次我能够从文件中读取,然后我试图让编码方法工作,但在某个时候发生了一些事情。任何帮助将不胜感激。

public class DvdLibraryInFileImpl implements DvdLibraryDao {

    private Map<Integer, DVD> dvdMap = new HashMap<>();
    public static final String DVD_FILE = "dvd.txt";
    public static final String DELIMITER = "::";
    private static int dvdIdCounter = 0;

    public DvdLibraryInFileImpl() throws FileNotFoundException {
      decode();

    }


    @Override
    public DVD addDVD(DVD dvd) {

        dvd.setDvdId(dvdIdCounter);

        dvdIdCounter++;

        dvdMap.put(dvd.getDvdId(), dvd);

        return dvd;
    }

    @Override
    public DVD getDVDById(int dvdId) {
        return dvdMap.get(dvdId);
    }

    @Override
    public List<DVD> getAllDVDSByName(String searchByName) {
        throw new UnsupportedOperationException("Not supported yet."); 
    }

    @Override
    public List<DVD> getAllDVDS() {
        List<DVD> allDVDS = new ArrayList<>(dvdMap.values());
        return allDVDS;
    }

    @Override
    public void updateDVD(DVD dvd) {
        dvdMap.put(dvd.getDvdId(), dvd);
    }

    @Override
    public void removeDVD(int dvdId) {
        dvdMap.remove(dvdId);
    }


    @Override
    public void decode() throws FileNotFoundException {
        Scanner sc = new Scanner(new BufferedReader(new FileReader(DVD_FILE)));
        String[] currentTokens;
        while (sc.hasNextLine()) {
            String currentLine = sc.nextLine();
            currentTokens = currentLine.split(DELIMITER);

            DVD currentDVD = new DVD();

            currentDVD.setDvdId(Integer.parseInt((currentTokens[0])));
            currentDVD.setTitle(currentTokens[1]);
            currentDVD.setReleaseDate(currentTokens[2]);
            currentDVD.setMpaaRating(currentTokens[3]);
            currentDVD.setDirectorsName(currentTokens[4]);
            currentDVD.setStudio(currentTokens[5]);
            currentDVD.setUserRating(currentTokens[6]);

            dvdMap.put(Integer.parseInt((currentTokens[0])), currentDVD);
        }

    }


    @Override
    public void encode() throws IOException {
        PrintWriter out = new PrintWriter(new FileWriter(DVD_FILE));
        Set<Integer> keySet = dvdMap.keySet();
        for (Integer i : keySet) {

            out.print((dvdMap.get(i)).getDvdId());
            out.print(DELIMITER);

            out.print((dvdMap.get(i)).getTitle());
            out.print(DELIMITER);

            out.print((dvdMap.get(i)).getReleaseDate());
            out.print(DELIMITER);

            out.print((dvdMap.get(i)).getMpaaRating());
            out.print(DELIMITER);

            out.print((dvdMap.get(i)).getDirectorsName());
            out.print(DELIMITER);

            out.print((dvdMap.get(i)).getStudio());
            out.print(DELIMITER);

            out.print((dvdMap.get(i)).getUserRating());
            out.println("");

        }
        out.flush();
        out.close();
    }
}

最佳答案

问题是因为 currentLine 没有收到正确的输入数据(来自用户输入)。

您应该确保 currentTokens 设置了正确的 DvdId(应该是数值),否则 Integer.parseInt((currentTokens[0])) 行将抛出 NumberFormatException 用于非数字或空 ("") 数据。

您需要确保输入的数据与数字 dvdid 正确无误。

例如,输入以下数据: 1234::DVDTITLE::29-OCT-2016::RATING1::DIRECTOR::STUDIO::RATING2

我强烈建议您添加输入验证来处理输入非数字值或评分高于最大值或导演姓名包含数字值等场景......

关于java - TomCat - 构造函数在尝试从文件中读取时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40322626/

相关文章:

java - WEB-INF可以在JSP Tomcat6的子目录下吗

java - 数据库连接 - java.net.UnknownHostException

file - 在类路径 grails war/tomcat 上找不到文件

java - HTML表单参数全部为空

Java:用递归画圆

java - 将 POSTMAN 代码翻译成 Java

在使用 IIS ISAPI 配置的 Tomcat 中,Spring 安全性不会拦截 URL

java - LuaJ 迭代强制 Java 对象中的对象数组

java - 使用 JSpinner 获取值

java - 如何在独立(非托管)应用程序中使用 jndi?