Java 数字格式问题,新手项目

Java 数字格式问题,新手项目,java,numberformatexception,Java,Numberformatexception,我正在尝试编写一个程序,加载一个电影数据库文件,然后将这些信息拆分为电影标题、年份和所有相关演员。我拆分了所有信息,但在将字符串中的年份转换为整数时遇到问题。年份字符串的格式为(****),其中*为年份,例如1999年。当我尝试使用parse时,我得到一个数字格式异常。我尝试过替换括号,但它只是给了我更多的错误!有什么想法吗 public class MovieDatabase { ArrayList<Movie> allMovie = new ArrayList<Movie

我正在尝试编写一个程序,加载一个电影数据库文件,然后将这些信息拆分为电影标题、年份和所有相关演员。我拆分了所有信息,但在将字符串中的年份转换为整数时遇到问题。年份字符串的格式为(****),其中*为年份,例如1999年。当我尝试使用parse时,我得到一个数字格式异常。我尝试过替换括号,但它只是给了我更多的错误!有什么想法吗

public class MovieDatabase {

ArrayList<Movie> allMovie = new ArrayList<Movie>();

//Loading the text file and breaking it apart into sections
public void loadDataFromFile( String aFileName) throws FileNotFoundException{
    Scanner theScanner = new Scanner(aFileName);
    theScanner = new Scanner(new FileInputStream("cast-mpaa.txt"));

    while(theScanner.hasNextLine()){
        String line = theScanner.nextLine();
        String[] splitting = line.split("/" );
        String movieTitleAndYear = splitting[0];
        int movieYearIndex = movieTitleAndYear.indexOf("(");
        String movieYear = movieTitleAndYear.substring(movieYearIndex);
        System.out.println(movieYear);
        //this is where I have issues
        int theYear = Integer.parseInt(movieYear);
        String movieTitle = movieTitleAndYear.substring(0, movieYearIndex);
        ArrayList<Actor> allActors = new ArrayList<Actor>();
        for ( int i = 1; i < splitting.length; i++){
            String[] names = splitting[i].split(",");
            String firstName = names[0];
            Actor theActor = new Actor(firstName);
            ArrayList<Actor> allActor = new ArrayList<Actor>();
            allActor.add(theActor);
        }

        Movie theMovie = new Movie(movieTitle, theYear, allActors);
        allMovie.add(theMovie);

    }       
    theScanner.close();
}
以下是我得到的错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "(1967)"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:481)
at java.lang.Integer.parseInt(Integer.java:527)
at MovieDatabase.loadDataFromFile(MovieDatabase.java:27)

数字周围有括号。您可以更正文件,也可以使用以下方法删除括号:

String str = "(1967)";
System.out.println(str.substring(1, str.length()-1));
Output:
1967
在代码中,您使用了:

int movieYearIndex = movieTitleAndYear.indexOf("(");
String movieYear = movieTitleAndYear.substring(movieYearIndex);
所以,如果我的movieTitleAndYear字符串是“hi(1947)”,indexOf将给我索引“(”as 3),子字符串将从索引3开始读取字符串,其中包括“(”。避免打开括号的一种方法是将子字符串行更改为:

String movieYear = movieTitleAndYear.substring(movieYearIndex + 1);//but still you have closing bracket.
如果您确定它始终是四位数,那么您可以执行以下操作:

String movieYear = movieTitleAndYear.substring(movieYearIndex + 1, movieYearIndex  + 5);

您的
子字符串
调用当前会得到一个用括号括起来的年份,例如,
(1967)
。您可以通过调用来避免这种情况,只需得到年份的四位数字:

String movieYear = 
    movieTitleAndYear.substring(movieYearIndex + 1, // to get rid of "("
                                movieYearIndex + 5 // to get rid of ")" 
                               );

您需要为“)”添加indexof。 代码段:

int movieYearOpenBracesIndex = movieTitleAndYear.indexOf("(");
int movieYearCloseBracesIndex = movieTitleAndYear.indexOf(")");
String movieYear = movieTitleAndYear.substring(movieYearOpenBracesIndex + 1, movieYearCloseBracesIndex);
System.out.println(movieYear);

这将给出确切的年份。例如,1967年。请添加stacktrace。并从文件中提取样本数据。在将其解析为
int
之前打印
movieYear
,并打印
movieYear
的值。与jbniset达成一致,打印movieYear将显示您的问题。最可能的问题是子字符串的结尾。在子字符串中(movieYearIndex);您只提到年初字符串,而没有提到年末字符串索引。如果年份像(xxxx),行字符串movieYear=movieTitleAndYear.substring(movieYearIndex);是错误的,因为它将返回类似xxxx的字符串)您缺少两个参数之间的昏迷:)@AlexandreLavoie多么尴尬:-)谢谢!(固定)
int movieYearOpenBracesIndex = movieTitleAndYear.indexOf("(");
int movieYearCloseBracesIndex = movieTitleAndYear.indexOf(")");
String movieYear = movieTitleAndYear.substring(movieYearOpenBracesIndex + 1, movieYearCloseBracesIndex);
System.out.println(movieYear);